diff --git a/.github/ISSUE_TEMPLATE/blank_issue.md b/.github/ISSUE_TEMPLATE/blank_issue.md deleted file mode 100644 index 57febe7d5f..0000000000 --- a/.github/ISSUE_TEMPLATE/blank_issue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -name: Blank Issue -about: Create a blank issue. -title: '' ---- diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..9fa3fad944 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "Add a placeholder for issue title. ex: [BUG]" +labels: bug +assignees: "" +--- + +**Is it a security vulnerability?** +If it results in a crash or hang, please refer to [a quick checklist](../../doc/security_need_to_know.md#is-this-bug-considered-a-security-vulnerability) to determine if it is a security vulnerability. If you are still unsure, please report it through [a security advisor](https://github.com/bytecodealliance/wasm-micro-runtime/security/advisories) and allow the maintainer to make a decision. Thank you. + +**Describe the bug** +A clear and concise description of what the bug is. + +**Version** +Information like tags, release version, commits. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Compile iwasm with flags like '...' +2. (Optional) Compile wamrc with flags like '....' +3. (Optional) Run wamrc with CLI options like '...' to generate .aot +4. Run iwasm with CLI options like '...' +5. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Actual Result** +What you've got. + +**Desktop (please complete the following information):** + +- Arch [e.g. x86_64, arm64, 32bit] +- Board [e.g. STM32F407] +- OS [e.g. Linux, Windows, macOS, FreeRTOS] +- Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..0086358db1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..f20f45edee --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: 'Add a placeholder for issue title. ex: [RFC]' +labels: help wanted +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/improvement.md b/.github/ISSUE_TEMPLATE/improvement.md deleted file mode 100644 index ffdf0906ff..0000000000 --- a/.github/ISSUE_TEMPLATE/improvement.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: Improvement -about: A feature request or code improvement. -title: '' -labels: '' -assignees: '' ---- - -Thanks for filing a feature request! Please fill out the TODOs below. - -#### Feature - -TODO: Brief description of the feature/improvement you'd like to see in WAMR - -#### Benefit - -TODO: What is the value of adding this in WAMR? What problems does it solve? - -#### Implementation - -TODO: Do you have an implementation plan, and/or ideas for data structures or -algorithms to use? - -#### Alternatives - -TODO: What are the alternative implementation approaches or alternative ways to -solve the problem that this feature would solve? How do these alternatives -compare to this proposal? diff --git a/.github/ISSUE_TEMPLATE/report_bug.md b/.github/ISSUE_TEMPLATE/report_bug.md deleted file mode 100644 index d3058c9ca1..0000000000 --- a/.github/ISSUE_TEMPLATE/report_bug.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: WAMR bug or defect report -about: Report a bug or defect in WAMR -title: '' ---- - -Thanks for filing a bug or defect report! Please fill out the TODOs below. - -### Subject of the issue - -Describe the bug or defect here. - -### Test case - -Upload the related wasm file, wast file or the source files if you can. - -### Your environment - -* Host OS -* WAMR version, platform, cpu architecture, running mode, etc. - -### Steps to reproduce - -Tell us how to reproduce this bug or defect. - -### Expected behavior - -Tell us what should happen - -### Actual behavior - -Tell us what happens instead - -### Extra Info - -Anything else you'd like to add? diff --git a/.github/codeql/codeql_config.yml b/.github/codeql/codeql_config.yml new file mode 100644 index 0000000000..3da712c645 --- /dev/null +++ b/.github/codeql/codeql_config.yml @@ -0,0 +1,46 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +paths: + - .github + - core/iwasm + - core/shared/platform/common/ + - core/shared/platform/include/ + - core/shared/platform/linux/ + - product-mini/platforms/common/ + - product-mini/platforms/linux/ + # TODO: add other platforms back if able to do cross-compilation + # - product-mini/platforms/ + # TODO: add samples back after buildscript modification + # - need to ignore workloads and wasm-apps + # - samples + - wamr-compiler/ +paths-ignore: + # always ignore build + - '**/build/**' + - '**/test*/**' + - '**/wasm-app*/**' + - core/deps/ + # platform specific + - core/iwasm/aot/arch/aot_reloc_aarch64.c + - core/iwasm/aot/arch/aot_reloc_arc.c + - core/iwasm/aot/arch/aot_reloc_arm.c + - core/iwasm/aot/arch/aot_reloc_dummy.c + - core/iwasm/aot/arch/aot_reloc_mips.c + - core/iwasm/aot/arch/aot_reloc_riscv.c + - core/iwasm/aot/arch/aot_reloc_thumb.c + - core/iwasm/aot/arch/aot_reloc_xtensa.c + - core/iwasm/libraries/lib-rats/ + - core/iwasm/libraries/lib-socket/ + - core/iwasm/libraries/lib-wasi-threads/*-test/ + - core/shared/platform/common/freertos/ + - core/shared/platform/common/math/ + #TODO: add me back if lldb libraries installed + - core/iwasm/compilation/debug/ + # spend disk space and slow + - core/iwasm/libraries/wasi-nn/src/wasi_nn_tflite* + #TODO: add me back if openvino installed + - core/iwasm/libraries/wasi-nn/src/wasi_nn_openvino* + # for wasm + - core/iwasm/libraries/wasi-nn/include/wasi_nn.h + # reference + - core/iwasm/common/arch/invokeNative_general.c diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0676cf7417..b8b6309c6b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -33,3 +33,58 @@ updates: directory: "/language-bindings/python/wamr-api" schedule: interval: "weekly" + +- package-ecosystem: pip + directory: /core/iwasm/libraries/wasi-nn/test + schedule: + interval: daily + +- package-ecosystem: gomod + directory: /language-bindings/go + schedule: + interval: daily + +- package-ecosystem: docker + directory: /product-mini/platforms/zephyr/simple + schedule: + interval: daily + +- package-ecosystem: nuget + directory: /samples/sgx-ra/non-sgx-verify/csharp + schedule: + interval: daily + +- package-ecosystem: npm + directory: /test-tools/wamr-ide/VSCode-Extension + schedule: + interval: daily + +- package-ecosystem: docker + directory: /test-tools/wamr-ide/WASM-Debug-Server/Docker + schedule: + interval: daily + +- package-ecosystem: docker + directory: /test-tools/wamr-ide/WASM-Toolchain/Docker + schedule: + interval: daily + +- package-ecosystem: docker + directory: /tests/fuzz/wasm-mutator-fuzz/portal + schedule: + interval: daily + +- package-ecosystem: npm + directory: /tests/fuzz/wasm-mutator-fuzz/portal + schedule: + interval: daily + +- package-ecosystem: docker + directory: /tests/fuzz/wasm-mutator-fuzz/server + schedule: + interval: daily + +- package-ecosystem: pip + directory: /tests/fuzz/wasm-mutator-fuzz/server + schedule: + interval: daily diff --git a/.github/scripts/codeql_buildscript.sh b/.github/scripts/codeql_buildscript.sh index 388f3680d3..706ff5b787 100755 --- a/.github/scripts/codeql_buildscript.sh +++ b/.github/scripts/codeql_buildscript.sh @@ -5,308 +5,117 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # -sudo apt update +# This script is used to build the WAMR project for CodeQL analysis. -sudo apt install -y build-essential cmake g++-multilib libgcc-12-dev lib32gcc-12-dev ccache ninja-build +# Pre-requisites +sudo apt -qq update +sudo apt install -y -qq build-essential cmake g++-multilib libgcc-12-dev lib32gcc-12-dev ccache ninja-build -WAMR_DIR=${PWD} - -# TODO: use pre-built llvm binary to build wamrc to -# avoid static code analysing for llvm -: ' -# build wamrc -cd ${WAMR_DIR}/wamr-compiler -./build_llvm.sh -rm -fr build && mkdir build && cd build -cmake .. -make -j -if [[ $? != 0 ]]; then - echo "Failed to build wamrc!" - exit 1; -fi -' - -# build iwasm with default features enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with default features enabled!" - exit 1; -fi - -# build iwasm with default features enabled on x86_32 -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DWAMR_BUILD_TARGET=X86_32 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with default features enabled on x86_32!" - exit 1; -fi - -# build iwasm with classic interpreter enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_INTERP=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with classic interpreter enabled!" - exit 1; -fi - -# build iwasm with extra features enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug \ - -DWAMR_BUILD_LIB_PTHREAD=1 -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ - -DWAMR_BUILD_MULTI_MODULE=1 -DWAMR_BUILD_SIMD=1 \ - -DWAMR_BUILD_TAIL_CALL=1 -DWAMR_BUILD_REF_TYPES=1 \ - -DWAMR_BUILD_CUSTOM_NAME_SECTION=1 -DWAMR_BUILD_MEMORY_PROFILING=1 \ - -DWAMR_BUILD_PERF_PROFILING=1 -DWAMR_BUILD_DUMP_CALL_STACK=1 \ - -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build wamrc iwasm with extra features enabled!" - exit 1; -fi - -# build iwasm with global heap pool enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug \ - -DWAMR_BUILD_ALLOC_WITH_USER_DATA=1 \ - -DWAMR_DISABLE_STACK_HW_BOUND_CHECK=1 \ - -DWAMR_BUILD_GLOBAL_HEAP_POOL=1 \ - -DWAMR_BUILD_GLOBAL_HEAP_SIZE=131072 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with global heap pool enabled!" - exit 1; -fi - -# build iwasm with wasi-threads enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_LIB_WASI_THREADS=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with wasi-threads enabled!" - exit 1; -fi - -# build iwasm with GC enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_GC=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with GC enabled!" - exit 1; -fi - -# build iwasm with exception handling enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_EXCE_HANDLING=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with exception handling enabled!" - exit 1; -fi - -# build iwasm with memory64 enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MEMORY64=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with memory64 enabled!" - exit 1; -fi - -# build iwasm with multi-memory enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MULTI_MEMORY=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with multi-memory enabled!" - exit 1; -fi - -# build iwasm with hardware boundary check disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_DISABLE_HW_BOUND_CHECK=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with hardware boundary check disabled!" - exit 1; -fi - -# build iwasm with quick AOT entry disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_QUICK_AOT_ENTRY=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with quick AOT entry disabled!" - exit 1; -fi +LLVM_VER=18.1.8 +pushd /opt +sudo wget --progress=dot:giga -O clang+llvm-x86_64-linux-gnu.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VER}/clang+llvm-${LLVM_VER}-x86_64-linux-gnu-ubuntu-18.04.tar.xz \ + && tar -xf clang+llvm-x86_64-linux-gnu.tar.xz \ + && mv clang+llvm-${LLVM_VER}-x86_64-linux-gnu-ubuntu-18.04 llvm-${LLVM_VER} +popd -# build iwasm with wakeup of blocking operations disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_DISABLE_WAKEUP_BLOCKING_OP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with wakeup of blocking operations disabled!" - exit 1; -fi +# libtinfo.so.5 for /opt/llvm-18.1.8/lib/libomptarget.rtl.amdgpu.so.18.1 +sudo apt -qq update +wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb +sudo apt install -y -qq ./libtinfo5_6.3-2ubuntu0.1_amd64.deb -# build iwasm with module instance context disabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MODULE_INST_CONTEXT=0 \ - -DWAMR_BUILD_LIBC_BUILTIN=0 -DWAMR_BUILD_LIBC_WASI=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with module instance context disabled!" - exit 1; -fi - -# build iwasm with libc-uvwasi enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -fr build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_LIBC_UVWASI=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with libc-uvwasi enabled!" - exit 1; -fi - -# build iwasm with fast jit lazy mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_FAST_JIT_DUMP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with fast jit lazy mode enabled!" - exit 1; -fi - -# build iwasm with fast jit eager mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_FAST_JIT_DUMP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with fast jit eager mode enabled!" - exit 1; -fi - -# TODO: use pre-built llvm binary to build llvm-jit and multi-tier-jit -: ' -# build iwasm with llvm jit lazy mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_JIT=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build llvm jit lazy mode enabled!" - exit 1; -fi - -# build iwasm with llvm jit eager mode enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=0 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build llvm jit eager mode enabled!" - exit 1; -fi - -# build iwasm with multi-tier jit enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 \ - -DWAMR_BUILD_FAST_JIT_DUMP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with multi-tier jit enabled!" - exit 1; -fi -' - -# build iwasm with wasm mini-loader enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MINI_LOADER=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build with wasm mini-loader enabled!" - exit 1; -fi - -# build iwasm with source debugging enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_DEBUG_INTERP=1 -DWAMR_BUILD_DEBUG_AOT=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with source debugging enabled!" - exit 1; -fi - -# build iwasm with AOT static PGO enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_STATIC_PGO=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with AOT static PGO enabled!" - exit 1; -fi - -# build iwasm with configurable bounds checks enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_CONFIGURABLE_BOUNDS_CHECKS=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with configurable bounds checks enabled!" - exit 1; -fi - -# build iwasm with linux perf support enabled -cd ${WAMR_DIR}/product-mini/platforms/linux/ -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_LINUX_PERF=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with linux perf support enabled!" - exit 1; -fi - -# build iwasm with shared heap enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_SHARED_HEAP=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm with shared heap enabled!" - exit 1; -fi - -# build iwasm with dynamic aot debug enabled -cd ${WAMR_DIR}/product-mini/platforms/linux -rm -rf build && mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_DYNAMIC_AOT_DEBUG=1 -make -j -if [[ $? != 0 ]]; then - echo "Failed to build iwasm dynamic aot debug enabled!" - exit 1; -fi +# Start the build process +WAMR_DIR=${PWD} +LLVM_DIR=/opt/llvm-${LLVM_VER}/lib/cmake/llvm + +# Function to build wamrc +build_wamrc() { + local options="$1" + echo "Building wamrc with options: $options" + + pushd ${WAMR_DIR}/wamr-compiler + rm -rf build + cmake -S . -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DWAMR_BUILD_WITH_CUSTOM_LLVM=1 -DLLVM_DIR=${LLVM_DIR} \ + $options + cmake --build build --target wamrc --parallel + if [[ $? != 0 ]]; then + echo "Failed to build wamrc with options: $options" + exit 1 + fi + popd +} + +# Function to build iwasm +build_iwasm() { + local options="$1" + echo "Building iwasm with options: $options" + + pushd ${WAMR_DIR}/product-mini/platforms/linux + rm -rf build + cmake -S . -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DLLVM_DIR=${LLVM_DIR} \ + $options + cmake --build build --target iwasm --parallel + if [[ $? != 0 ]]; then + echo "Failed to build iwasm with options: $options" + exit 1 + fi + popd +} + +# List of compilation options for wamrc +wamrc_options_list=( + #default + "" +) + +# List of compilation options for iwasm +iwasm_options_list=( + #default + "" + # +classic interp + "-DWAMR_BUILD_FAST_INTERP=0" + # +llvm jit + fast jit + "-DWAMR_BUILD_JIT=1 -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_FAST_JIT_DUMP=1" + # + "-DWAMR_BUILD_TARGET=X86_32" + # + # libraries + "-DWAMR_BUILD_LIBC_BUILTIN=0 -DWAMR_BUILD_LIBC_UVWASI=1 -DWAMR_BUILD_LIBC_EMCC=1" + "-DWAMR_BUILD_THREAD_MGR=1 -DWAMR_BUILD_LIB_PTHREAD=1 -DWAMR_BUILD_SHARED_MEMORY=1 -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1" + "-DWAMR_BUILD_THREAD_MGR=1 -DWAMR_BUILD_LIB_WASI_THREADS=1 -DWAMR_BUILD_SHARED_MEMORY=1 -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1" + "-DWAMR_BUILD_WASI_NN=1 -DWAMR_BUILD_WASI_NN_LLAMACPP=1" + # + # Wasm specs + "-DWAMR_BUILD_GC=1 -DWAMR_BUILD_EXCE_HANDLING=1 -DWAMR_BUILD_STRINGREF=1 -DWAMR_STRINGREF_IMPL_SOURCE=STUB" + "-DWAMR_BUILD_MEMORY64=1 -DWAMR_BUILD_MULTI_MEMORY=1" + # + # WARM features + "-DWAMR_BUILD_MULTI_MODULE=1 -DWAMR_BUILD_MINI_LOADER=1 -DWAMR_BUILD_SHARED_HEAP=1" + "-DWAMR_DISABLE_HW_BOUND_CHECK=1" + "-DWAMR_CONFIGURABLE_BOUNDS_CHECKS=1" + # - Debug + "-DWAMR_BUILD_DEBUG_INTERP=1 -DWAMR_BUILD_DEBUG_AOT=1 -DWAMR_BUILD_DYNAMIC_AOT_DEBUG=1" + # - developer options + "-DWAMR_BUILD_CUSTOM_NAME_SECTION=1 -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1 -DWAMR_BUILD_DUMP_CALL_STACK=1 -DWAMR_BUILD_LINUX_PERF=1 -DWAMR_BUILD_AOT_VALIDATOR=1 -DWAMR_BUILD_MEMORY_PROFILING=1 -DWAMR_BUILD_PERF_PROFILING=1" + # - global heap + "-DWAMR_BUILD_ALLOC_WITH_USER_DATA=1 -DWAMR_BUILD_GLOBAL_HEAP_POOL=1 -DWAMR_BUILD_GLOBAL_HEAP_SIZE=131072" + "-DWAMR_BUILD_QUICK_AOT_ENTRY=0 -DWAMR_DISABLE_WAKEUP_BLOCKING_OP=1 -DWAMR_BUILD_MODULE_INST_CONTEXT=0" + # - pgo + "-DWAMR_BUILD_STATIC_PGO=1" + # TODO: SGX specifics. +) + +# Loop through all iwasm options and build +for options in "${iwasm_options_list[@]}"; do + build_iwasm "$options" +done + +# Loop through all wamrc options and build +for options in "${wamrc_options_list[@]}"; do + build_wamrc "$options" +done diff --git a/.github/workflows/build_docker_images.yml b/.github/workflows/build_docker_images.yml index f7643af3fd..8ed2b31cf8 100644 --- a/.github/workflows/build_docker_images.yml +++ b/.github/workflows/build_docker_images.yml @@ -25,8 +25,13 @@ jobs: contents: write # for uploading release artifacts steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Build and save Docker image(wasm-debug-server:${{ inputs.ver_num }}) to tar file run: | @@ -41,7 +46,7 @@ jobs: working-directory: test-tools/wamr-ide/WASM-Debug-Server/Docker - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -51,7 +56,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -73,7 +78,7 @@ jobs: working-directory: test-tools/wamr-ide/WASM-Toolchain/Docker - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -83,7 +88,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_iwasm_release.yml b/.github/workflows/build_iwasm_release.yml index 6acd90fa64..707470d375 100644 --- a/.github/workflows/build_iwasm_release.yml +++ b/.github/workflows/build_iwasm_release.yml @@ -32,60 +32,60 @@ on: required: false env: - DEFAULT_BUILD_OPTIONS: + DEFAULT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 \ - -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ - -DWAMR_BUILD_DEBUG_INTERP=0 \ - -DWAMR_BUILD_DEBUG_AOT=0 \ - -DWAMR_BUILD_DUMP_CALL_STACK=0 \ - -DWAMR_BUILD_LIBC_UVWASI=0 \ - -DWAMR_BUILD_LIBC_EMCC=0 \ - -DWAMR_BUILD_LIB_RATS=0 \ - -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ - -DWAMR_BUILD_MEMORY_PROFILING=0 \ - -DWAMR_BUILD_MINI_LOADER=0 \ - -DWAMR_BUILD_MULTI_MODULE=0 \ - -DWAMR_BUILD_PERF_PROFILING=0 \ - -DWAMR_BUILD_SPEC_TEST=0 \ - -DWAMR_BUILD_BULK_MEMORY=1 \ - -DWAMR_BUILD_LIB_PTHREAD=1 \ - -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ - -DWAMR_BUILD_LIB_WASI_THREADS=1 \ - -DWAMR_BUILD_LIBC_BUILTIN=1 \ - -DWAMR_BUILD_LIBC_WASI=1 \ - -DWAMR_BUILD_REF_TYPES=1 \ - -DWAMR_BUILD_SIMD=1 \ - -DWAMR_BUILD_SHARED_MEMORY=1 \ - -DWAMR_BUILD_TAIL_CALL=1 \ - -DWAMR_BUILD_THREAD_MGR=1" + -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ + -DWAMR_BUILD_DEBUG_INTERP=0 \ + -DWAMR_BUILD_DEBUG_AOT=0 \ + -DWAMR_BUILD_DUMP_CALL_STACK=0 \ + -DWAMR_BUILD_LIBC_UVWASI=0 \ + -DWAMR_BUILD_LIBC_EMCC=0 \ + -DWAMR_BUILD_LIB_RATS=0 \ + -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ + -DWAMR_BUILD_MEMORY_PROFILING=0 \ + -DWAMR_BUILD_MINI_LOADER=0 \ + -DWAMR_BUILD_MULTI_MODULE=0 \ + -DWAMR_BUILD_PERF_PROFILING=0 \ + -DWAMR_BUILD_SPEC_TEST=0 \ + -DWAMR_BUILD_BULK_MEMORY=1 \ + -DWAMR_BUILD_LIB_PTHREAD=1 \ + -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ + -DWAMR_BUILD_LIB_WASI_THREADS=1 \ + -DWAMR_BUILD_LIBC_BUILTIN=1 \ + -DWAMR_BUILD_LIBC_WASI=1 \ + -DWAMR_BUILD_REF_TYPES=1 \ + -DWAMR_BUILD_SIMD=1 \ + -DWAMR_BUILD_SHARED_MEMORY=1 \ + -DWAMR_BUILD_TAIL_CALL=1 \ + -DWAMR_BUILD_THREAD_MGR=1" GC_EH_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_FAST_JIT=0 -DWAMR_BUILD_JIT=0 \ - -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ - -DWAMR_BUILD_DEBUG_INTERP=0 \ - -DWAMR_BUILD_DEBUG_AOT=0 \ - -DWAMR_BUILD_DUMP_CALL_STACK=0 \ - -DWAMR_BUILD_LIBC_UVWASI=0 \ - -DWAMR_BUILD_LIBC_EMCC=0 \ - -DWAMR_BUILD_LIB_RATS=0 \ - -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ - -DWAMR_BUILD_MEMORY_PROFILING=0 \ - -DWAMR_BUILD_MINI_LOADER=0 \ - -DWAMR_BUILD_MULTI_MODULE=0 \ - -DWAMR_BUILD_PERF_PROFILING=0 \ - -DWAMR_BUILD_SPEC_TEST=0 \ - -DWAMR_BUILD_BULK_MEMORY=1 \ - -DWAMR_BUILD_LIB_PTHREAD=1 \ - -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ - -DWAMR_BUILD_LIB_WASI_THREADS=1 \ - -DWAMR_BUILD_LIBC_BUILTIN=1 \ - -DWAMR_BUILD_LIBC_WASI=1 \ - -DWAMR_BUILD_REF_TYPES=1 \ - -DWAMR_BUILD_SIMD=1 \ - -DWAMR_BUILD_SHARED_MEMORY=1 \ - -DWAMR_BUILD_TAIL_CALL=1 \ - -DWAMR_BUILD_THREAD_MGR=1 \ - -DWAMR_BUILD_EXCE_HANDLING=1 \ - -DWAMR_BUILD_GC=1" + -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ + -DWAMR_BUILD_DEBUG_INTERP=0 \ + -DWAMR_BUILD_DEBUG_AOT=0 \ + -DWAMR_BUILD_DUMP_CALL_STACK=0 \ + -DWAMR_BUILD_LIBC_UVWASI=0 \ + -DWAMR_BUILD_LIBC_EMCC=0 \ + -DWAMR_BUILD_LIB_RATS=0 \ + -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ + -DWAMR_BUILD_MEMORY_PROFILING=0 \ + -DWAMR_BUILD_MINI_LOADER=0 \ + -DWAMR_BUILD_MULTI_MODULE=0 \ + -DWAMR_BUILD_PERF_PROFILING=0 \ + -DWAMR_BUILD_SPEC_TEST=0 \ + -DWAMR_BUILD_BULK_MEMORY=1 \ + -DWAMR_BUILD_LIB_PTHREAD=1 \ + -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ + -DWAMR_BUILD_LIB_WASI_THREADS=1 \ + -DWAMR_BUILD_LIBC_BUILTIN=1 \ + -DWAMR_BUILD_LIBC_WASI=1 \ + -DWAMR_BUILD_REF_TYPES=1 \ + -DWAMR_BUILD_SIMD=1 \ + -DWAMR_BUILD_SHARED_MEMORY=1 \ + -DWAMR_BUILD_TAIL_CALL=1 \ + -DWAMR_BUILD_THREAD_MGR=1 \ + -DWAMR_BUILD_EXCE_HANDLING=1 \ + -DWAMR_BUILD_GC=1" permissions: contents: read @@ -97,18 +97,23 @@ jobs: matrix: include: - build_options: $DEFAULT_BUILD_OPTIONS - suffix: '' + suffix: "" - build_options: $GC_EH_BUILD_OPTIONS - suffix: '-gc-eh' + suffix: "-gc-eh" permissions: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: get cached LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -126,8 +131,32 @@ jobs: cmake --build build --config Release --parallel 4 working-directory: ${{ inputs.cwd }} + - name: smoke test on non-Windows + if: ${{ !startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/iwasm ]]; then + echo "iwasm binary is not found in the expected location." + exit 1 + fi + + build/iwasm --version + working-directory: ${{ inputs.cwd }} + + - name: smoke test on Windows + if: ${{ startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/Release/iwasm ]]; then + echo "iwasm binary is not found in the expected location." + exit 1 + fi + + build/Release/iwasm --version + working-directory: ${{ inputs.cwd }} + - name: Compress the binary on Windows - if: inputs.runner == 'windows-latest' + if: inputs.runner == 'windows-2022' run: | tar -czf iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz iwasm.exe Compress-Archive -Path iwasm.exe -DestinationPath iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.zip @@ -135,7 +164,7 @@ jobs: working-directory: ${{ inputs.cwd }}/build/Release - name: compress the binary on non-Windows - if: inputs.runner != 'windows-latest' + if: inputs.runner != 'windows-2022' run: | # Follow the symlink to the actual binary file tar --dereference -czf iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz iwasm @@ -143,7 +172,7 @@ jobs: working-directory: ${{ inputs.cwd }}/build - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -153,7 +182,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_llvm_libraries.yml b/.github/workflows/build_llvm_libraries.yml index 97e665c0bb..0ec5f21d4d 100644 --- a/.github/workflows/build_llvm_libraries.yml +++ b/.github/workflows/build_llvm_libraries.yml @@ -44,8 +44,13 @@ jobs: actions: write # for uploading cached artifact steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install dependencies for non macos-14 if: inputs.os != 'macos-14' @@ -79,7 +84,7 @@ jobs: - name: Cache LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -89,7 +94,7 @@ jobs: ./core/deps/llvm/build/share key: ${{ steps.create_lib_cache_key.outputs.key}} - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/.cache/ccache key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} @@ -101,7 +106,7 @@ jobs: - run: sudo apt install -y ccache ninja-build if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'ubuntu') && inputs.container_image == '' - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/Library/Caches/ccache key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} @@ -112,17 +117,17 @@ jobs: - run: brew install ccache ninja if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'macos') - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/.cache/ccache key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} restore-keys: | 0-ccache-${{ inputs.os }} - if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-latest' + if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-2022' # Install tools on Windows - run: choco install -y ccache ninja - if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-latest' + if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-2022' - name: Build LLVM libraries if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' diff --git a/.github/workflows/build_wamr_lldb.yml b/.github/workflows/build_wamr_lldb.yml index 297328cc5a..9494e2d818 100644 --- a/.github/workflows/build_wamr_lldb.yml +++ b/.github/workflows/build_wamr_lldb.yml @@ -55,7 +55,12 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: download and install wasi-sdk run: | @@ -68,7 +73,7 @@ jobs: - name: Cache build id: lldb_build_cache - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm-project/build/bin @@ -82,7 +87,7 @@ jobs: - name: setup xcode macos if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'macos') - uses: maxim-lobanov/setup-xcode@v1 + uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 with: xcode-version: latest-stable @@ -249,7 +254,7 @@ jobs: working-directory: core/deps/llvm-project - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -259,7 +264,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamr_sdk.yml b/.github/workflows/build_wamr_sdk.yml index 266c3a6466..ff8026c850 100644 --- a/.github/workflows/build_wamr_sdk.yml +++ b/.github/workflows/build_wamr_sdk.yml @@ -45,7 +45,12 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: download wamr-app-framework run: | @@ -84,7 +89,7 @@ jobs: working-directory: wamr-sdk - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -94,7 +99,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamr_vscode_ext.yml b/.github/workflows/build_wamr_vscode_ext.yml index d0fa3b18ee..ee96d7e140 100644 --- a/.github/workflows/build_wamr_vscode_ext.yml +++ b/.github/workflows/build_wamr_vscode_ext.yml @@ -24,10 +24,15 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Use Node.js 18.x - uses: actions/setup-node@v4 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 18.x @@ -59,7 +64,7 @@ jobs: working-directory: test-tools/wamr-ide/VSCode-Extension - name: upload release tar.gz - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -69,7 +74,7 @@ jobs: asset_content_type: application/x-gzip - name: upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamr_wasi_extensions.yml b/.github/workflows/build_wamr_wasi_extensions.yml index 5412d794d1..66271f541e 100644 --- a/.github/workflows/build_wamr_wasi_extensions.yml +++ b/.github/workflows/build_wamr_wasi_extensions.yml @@ -27,8 +27,13 @@ jobs: matrix: os: [ubuntu-22.04] steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -47,7 +52,7 @@ jobs: working-directory: wamr-wasi-extensions/dist - name: Upload release zip - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/build_wamrc.yml b/.github/workflows/build_wamrc.yml index 07e3c7cdb0..4d3fbb1e2a 100644 --- a/.github/workflows/build_wamrc.yml +++ b/.github/workflows/build_wamrc.yml @@ -41,11 +41,16 @@ jobs: contents: write # for uploading release artifacts steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: get cached LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -62,8 +67,32 @@ jobs: cmake --build build --config Release --parallel 4 working-directory: wamr-compiler + - name: smoke test on non-windows + if: ${{ !startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/wamrc ]]; then + echo "wamrc binary is not found in the expected location." + exit 1 + fi + + build/wamrc --version + working-directory: wamr-compiler + + - name: smoke test on Windows + if: ${{ startsWith(inputs.runner, 'windows') }} + shell: bash + run: | + if [[ ! -f build/Release/wamrc ]]; then + echo "wamrc binary is not found in the expected location." + exit 1 + fi + + build/Release/wamrc --version + working-directory: wamr-compiler + - name: Compress the binary on Windows - if: inputs.runner == 'windows-latest' && inputs.release + if: inputs.runner == 'windows-2022' && inputs.release run: | tar -czf wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamrc.exe Compress-Archive -Path wamrc.exe -DestinationPath wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.zip @@ -71,7 +100,7 @@ jobs: working-directory: wamr-compiler/build/Release - name: compress the binary on non-Windows - if: inputs.runner != 'windows-latest' && inputs.release + if: inputs.runner != 'windows-2022' && inputs.release run: | # Follow the symlink to the actual binary file tar --dereference -czf wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamrc @@ -80,7 +109,7 @@ jobs: - name: upload release tar.gz if: inputs.release - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -91,7 +120,7 @@ jobs: - name: upload release zip if: inputs.release - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/check_version_h.yml b/.github/workflows/check_version_h.yml index ab23ecf9ed..acbd90d005 100644 --- a/.github/workflows/check_version_h.yml +++ b/.github/workflows/check_version_h.yml @@ -13,8 +13,13 @@ jobs: runs-on: ubuntu-latest steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: cmake execute to generate version.h run: cmake -B build_version -S . diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5325d4c2ef..510d8074c1 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,21 +1,17 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + name: "CodeQL" on: - #pull_request: - # types: - # - opened - # branches: '*' - #push: - # branches: [ "main" ] - # midnight UTC + # run on every push to the feature-development branch + # the main branch is covered by below cron plan + push: + branches: + - dev/** + # midnight UTC on the latest commit on the main branch schedule: - - cron: '0 0 * * *' + - cron: "0 0 * * *" # allow to be triggered manually workflow_dispatch: @@ -24,6 +20,8 @@ permissions: jobs: analyze: + # only run this job if the repository is not a fork + # if want to run this job on a fork, please remove the if condition if: github.repository == 'bytecodealliance/wasm-micro-runtime' name: Analyze # Runner size impacts CodeQL analysis time. To learn more, please see: @@ -31,14 +29,15 @@ jobs: # - https://gh.io/supported-runners-and-hardware-resources # - https://gh.io/using-larger-runners # Consider using larger runners for possible analysis time improvements. - runs-on: ${{ (matrix.language == 'swift' && 'macos-13') || 'ubuntu-22.04' }} - timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + # But it is not free, so please be aware of the cost. + runs-on: ubuntu-22.04 + timeout-minutes: 360 strategy: fail-fast: false matrix: - language: [ 'cpp' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] + #TODO: add actions + language: ["cpp"] permissions: contents: read @@ -46,76 +45,100 @@ jobs: security-events: write steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - submodules: recursive - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3.29.3 - with: - languages: ${{ matrix.language }} + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - queries: security-and-quality + - name: Checkout repository + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + with: + submodules: recursive - # Command-line programs to run using the OS shell. - # See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 + with: + languages: ${{ matrix.language }} + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + queries: security-and-quality + config-file: ./.github/codeql/codeql_config.yml - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + - run: | + ./.github/scripts/codeql_buildscript.sh - - run: | - ./.github/scripts/codeql_buildscript.sh - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3.29.3 - with: - category: "/language:${{matrix.language}}" - upload: false - id: step1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@39edc492dbe16b1465b0cafca41432d857bdb31a # v3.29.1 + with: + category: "/language:${{matrix.language}}" + upload: false + id: step1 - # Filter out rules with low severity or high false positve rate - # Also filter out warnings in third-party code - - name: Filter out unwanted errors and warnings - uses: advanced-security/filter-sarif@v1 - with: - patterns: | - -**:cpp/path-injection - -**:cpp/world-writable-file-creation - -**:cpp/poorly-documented-function - -**:cpp/potentially-dangerous-function - -**:cpp/use-of-goto - -**:cpp/integer-multiplication-cast-to-long - -**:cpp/comparison-with-wider-type - -**:cpp/leap-year/* - -**:cpp/ambiguously-signed-bit-field - -**:cpp/suspicious-pointer-scaling - -**:cpp/suspicious-pointer-scaling-void - -**:cpp/unsigned-comparison-zero - -**/cmake*/Modules/** - input: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + # - cpp/alloca-in-loop is about touch_pages() which is intended to + # - cpp/command-line-injection is about bh_system() which is used to + # - cpp/path-injection is used in bh_read_file_to_buffer() to load a .wasm. + # or operate a stack usage file which is not sensitive or generate a .aot + # - cpp/suspicious-pointer-scaling + # - wasm_runtime_invoke_native() used to trivial registers + # - cpp/uncontrolled-process-operation is about dlopen() which is used by + # native libraries registrations. + # - cpp/world-writable-file-creation is about fopen() a temporary file + # for perf-PID.map or .aot(wamrc). The permission isn't sensitive. + # file. + # + # execute customized compiler + - name: Filter out unwanted errors and warnings + uses: advanced-security/filter-sarif@f3b8118a9349d88f7b1c0c488476411145b6270d # v1.0.1 + with: + patterns: | + ## Exclude files and directories + -**/build/** + -**/core/deps/** + -**/cmake*/Modules/** + -**/test*/** + -**/wasm-app*/** + ## Exclude rules 1. Related to formatting, style + -**:cpp/commented-out-code + -**:cpp/complex-condition + -**:cpp/empty-if + -**:cpp/fixme-comment + -**:cpp/include-non-header + -**:cpp/long-switch + -**:cpp/poorly-documented-function + -**:cpp/trivial-switch + -**:cpp/unused-local-variable + -**:cpp/unused-static-function + -**:cpp/unused-static-variable + -**:cpp/use-of-goto + ## Exclude rules 2. Related to special usage of APIs + -**:cpp/alloca-in-loop + -**:cpp/command-line-injection + -**:cpp/path-injection + -core/iwasm/common/wasm_runtime_common.c:cpp/suspicious-pointer-scaling + -**:cpp/uncontrolled-process-operation + -**:cpp/world-writable-file-creation + input: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - - name: Upload CodeQL results to code scanning - uses: github/codeql-action/upload-sarif@v3.29.3 - with: - sarif_file: ${{ steps.step1.outputs.sarif-output }} - category: "/language:${{matrix.language}}" + - name: Upload CodeQL results to code scanning + uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 + with: + sarif_file: ${{ steps.step1.outputs.sarif-output }} + category: "/language:${{matrix.language}}" - - name: Upload CodeQL results as an artifact - if: success() || failure() - uses: actions/upload-artifact@v4.6.2 - with: - name: codeql-results - path: ${{ steps.step1.outputs.sarif-output }} - retention-days: 10 + - name: Upload CodeQL results as an artifact + if: success() || failure() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: codeql-results + path: ${{ steps.step1.outputs.sarif-output }} + retention-days: 10 - - name: Fail if an error is found - run: | - ./.github/scripts/codeql_fail_on_error.py \ - ${{ steps.step1.outputs.sarif-output }}/cpp.sarif - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_REPOSITORY: ${{ github.repository }} + - name: Fail if an error is found + run: | + ./.github/scripts/codeql_fail_on_error.py \ + ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} diff --git a/.github/workflows/coding_guidelines.yml b/.github/workflows/coding_guidelines.yml index b1f59ce3b9..e601f24ae7 100644 --- a/.github/workflows/coding_guidelines.yml +++ b/.github/workflows/coding_guidelines.yml @@ -21,8 +21,13 @@ jobs: compliance_job: runs-on: ubuntu-22.04 steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/compilation_on_android_ubuntu.yml b/.github/workflows/compilation_on_android_ubuntu.yml index 828773ae0a..414d1ad09e 100644 --- a/.github/workflows/compilation_on_android_ubuntu.yml +++ b/.github/workflows/compilation_on_android_ubuntu.yml @@ -100,14 +100,19 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -124,7 +129,7 @@ jobs: - name: Build wamrc run: | mkdir build && cd build - cmake .. + cmake .. -DCMAKE_C_FLAGS="-Werror" cmake --build . --config Release --parallel 4 working-directory: wamr-compiler @@ -166,6 +171,7 @@ jobs: "-DWAMR_BUILD_MULTI_MEMORY=1", "-DWAMR_BUILD_SHARED=1", "-DWAMR_BUILD_EXTENDED_CONST_EXPR=1", + "-DWAMR_BUILD_LIME1=1 -DWAMR_BUILD_BULK_MEMORY=0 -DWAMR_BUILD_REF_TYPES=0 -DWAMR_BUILD_SIMD=0", ] os: [ubuntu-22.04] platform: [android, linux] @@ -268,14 +274,19 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # only download llvm cache when needed - name: Get LLVM libraries id: retrieve_llvm_libs if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS') - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -293,7 +304,7 @@ jobs: if: matrix.platform == 'linux' run: | mkdir build && cd build - cmake .. ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} + cmake .. -DCMAKE_C_FLAGS="-Werror" ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} cmake --build . --config Release --parallel 4 working-directory: product-mini/platforms/${{ matrix.platform }} @@ -301,7 +312,7 @@ jobs: if: matrix.platform == 'android' run: | mkdir build && cd build - cmake .. ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} \ + cmake .. -DCMAKE_C_FLAGS="-Werror" ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} \ -DWAMR_BUILD_TARGET=X86_64 cmake --build . --config Release --parallel 4 working-directory: product-mini/platforms/${{ matrix.platform }} @@ -326,12 +337,17 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -349,7 +365,7 @@ jobs: uses: ./.github/actions/install-wasi-sdk-wabt with: os: ${{ matrix.os }} - + - name: Build wamrc run: | mkdir build && cd build @@ -360,17 +376,64 @@ jobs: - name: Install dependencies for X86_32 if: matrix.build_target == 'X86_32' run: | + sudo dpkg --add-architecture i386 sudo apt-get update - sudo apt-get install -y g++-multilib + sudo apt-get install -y g++-multilib libzstd-dev:i386 zlib1g-dev:i386 - name: Build and run unit tests run: | mkdir build && cd build cmake .. -DWAMR_BUILD_TARGET=${{ matrix.build_target }} - cmake --build . --config Release --parallel 4 - ctest + cmake --build . --parallel 4 + ctest --output-on-failure working-directory: tests/unit + build_regression_tests: + needs: + [build_llvm_libraries_on_ubuntu_2204] + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-22.04] + include: + - os: ubuntu-22.04 + llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} + + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - name: checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + - name: Get LLVM libraries + id: retrieve_llvm_libs + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + with: + path: | + ./core/deps/llvm/build/bin + ./core/deps/llvm/build/include + ./core/deps/llvm/build/lib + ./core/deps/llvm/build/libexec + ./core/deps/llvm/build/share + key: ${{ matrix.llvm_cache_key }} + + - name: Quit if cache miss + if: (steps.retrieve_llvm_libs.outputs.cache-hit != 'true') + run: echo "::error::can not get prebuilt llvm libraries" && exit 1 + + - name: Build wamrc and iwasm + run: | + ./build_wamr.sh + working-directory: tests/regression/ba-issues + + - name: Run regression tests + run: | + python run.py + working-directory: tests/regression/ba-issues + build_samples_wasm_c_api: needs: [ @@ -398,13 +461,18 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS')) - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -460,12 +528,17 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -580,6 +653,14 @@ jobs: ./shared_heap_test ./shared_heap_test --aot + - name: Build Sample [import-func-callback] + run: | + cd samples/import-func-callback + mkdir build && cd build + cmake .. + cmake --build . --config Release --parallel 4 + ./import-func-callback + test: needs: [ @@ -623,11 +704,16 @@ jobs: test_option: $WAMR_COMPILER_TEST_OPTIONS steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Set-up OCaml - uses: ocaml/setup-ocaml@v3 + uses: ocaml/setup-ocaml@ddef532293b85980b315344506def8eb09917e2c # v3.4.6 if: matrix.test_option == '$GC_TEST_OPTIONS' with: ocaml-compiler: 4.13 @@ -658,7 +744,7 @@ jobs: - name: Get LLVM libraries if: env.USE_LLVM == 'true' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin diff --git a/.github/workflows/compilation_on_macos.yml b/.github/workflows/compilation_on_macos.yml index 462e273bfd..d8a178ba6b 100644 --- a/.github/workflows/compilation_on_macos.yml +++ b/.github/workflows/compilation_on_macos.yml @@ -85,12 +85,17 @@ jobs: - os: macos-13 llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -107,7 +112,7 @@ jobs: - name: Build wamrc run: | mkdir build && cd build - cmake .. + cmake .. -DCMAKE_C_FLAGS="-Werror" cmake --build . --config Release --parallel 4 working-directory: wamr-compiler @@ -189,14 +194,19 @@ jobs: - os: macos-13 llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # only download llvm cache when needed - name: Get LLVM libraries id: retrieve_llvm_libs if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS') - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -213,7 +223,7 @@ jobs: - name: Build iwasm run: | mkdir build && cd build - cmake .. ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} + cmake .. -DCMAKE_C_FLAGS="-Werror" ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }} cmake --build . --config Release --parallel 4 working-directory: product-mini/platforms/${{ matrix.platform }} @@ -242,13 +252,18 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS')) - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -300,8 +315,13 @@ jobs: - os: macos-14 llvm_cache_key: ${{ needs.build_llvm_libraries_on_arm_macos.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -356,7 +376,7 @@ jobs: - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -422,3 +442,11 @@ jobs: cmake --build . --config Debug --parallel 4 ./shared_heap_test ./shared_heap_test --aot + + - name: Build Sample [import-func-callback] + run: | + cd samples/import-func-callback + mkdir build && cd build + cmake .. + cmake --build . --config Release --parallel 4 + ./import-func-callback diff --git a/.github/workflows/compilation_on_nuttx.yml b/.github/workflows/compilation_on_nuttx.yml index 5922f5e3a9..1e9c490cea 100644 --- a/.github/workflows/compilation_on_nuttx.yml +++ b/.github/workflows/compilation_on_nuttx.yml @@ -84,22 +84,27 @@ jobs: - "CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI" steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout NuttX - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx ref: releases/12.9 path: nuttx - name: Checkout NuttX Apps - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx-apps ref: releases/12.9 path: apps - name: Checkout WAMR - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: ${{ github.repository }} path: apps/interpreters/wamr/wamr @@ -122,7 +127,7 @@ jobs: run: make -j$(nproc) EXTRAFLAGS=-Werror - name: Checkout Bloaty - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: google/bloaty submodules: recursive diff --git a/.github/workflows/compilation_on_sgx.yml b/.github/workflows/compilation_on_sgx.yml index ec27fd8baa..3bcd16eb15 100644 --- a/.github/workflows/compilation_on_sgx.yml +++ b/.github/workflows/compilation_on_sgx.yml @@ -115,8 +115,13 @@ jobs: - make_options_run_mode: $AOT_BUILD_OPTIONS make_options_feature: "-DWAMR_BUILD_MINI_LOADER=1" steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install SGX SDK and necessary libraries uses: ./.github/actions/install-linux-sgx @@ -158,8 +163,13 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -183,7 +193,7 @@ jobs: - name: Get LLVM libraries if: matrix.iwasm_make_options_run_mode == '$AOT_BUILD_OPTIONS' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -254,13 +264,18 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries if: matrix.running_mode == 'aot' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin diff --git a/.github/workflows/compilation_on_windows.yml b/.github/workflows/compilation_on_windows.yml index 7cee2aa400..aa5280de04 100644 --- a/.github/workflows/compilation_on_windows.yml +++ b/.github/workflows/compilation_on_windows.yml @@ -1,7 +1,7 @@ # Copyright (C) 2019 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -name: compilation on windows-latest +name: compilation on windows-2022 on: # will be triggered on PR events @@ -63,11 +63,11 @@ jobs: actions: write uses: ./.github/workflows/build_llvm_libraries.yml with: - os: "windows-latest" + os: "windows-2022" arch: "AArch64 ARM Mips RISCV X86" build_iwasm: - runs-on: windows-latest + runs-on: windows-2022 strategy: matrix: build_options: @@ -85,7 +85,12 @@ jobs: "-DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1", ] steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: clone uvwasi library if: ${{ !contains(matrix.build_options, '-DWAMR_BUILD_LIBC_UVWASI=0') }} @@ -105,17 +110,22 @@ jobs: strategy: matrix: include: - - os: windows-latest + - os: windows-2022 llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -136,7 +146,7 @@ jobs: working-directory: wamr-compiler test: - runs-on: windows-latest + runs-on: windows-2022 needs: [build_iwasm, build_wamrc] strategy: fail-fast: false @@ -150,8 +160,13 @@ jobs: $WASI_TEST_OPTIONS, ] steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: download and install wasi-sdk if: matrix.test_option == '$WASI_TEST_OPTIONS' diff --git a/.github/workflows/compilation_on_zephyr.yml b/.github/workflows/compilation_on_zephyr.yml index 274fc37406..899adda4df 100644 --- a/.github/workflows/compilation_on_zephyr.yml +++ b/.github/workflows/compilation_on_zephyr.yml @@ -11,6 +11,7 @@ on: - synchronize paths: - ".github/**" + - "!.github/ISSUE_TEMPLATE/**" - "build-scripts/**" - "core/**" - "!core/deps/**" @@ -27,6 +28,7 @@ on: - "dev/**" paths: - ".github/**" + - "!.github/ISSUE_TEMPLATE/**" - "build-scripts/**" - "core/**" - "!core/deps/**" @@ -77,8 +79,13 @@ jobs: # ├─── vendor/ # └─── application/ --> DUMMY. keep west_lite.yml here + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: path: modules/wasm-micro-runtime @@ -89,7 +96,7 @@ jobs: cp modules/wasm-micro-runtime/product-mini/platforms/zephyr/simple/west_lite.yml application/west_lite.yml - name: Setup Zephyr project - uses: zephyrproject-rtos/action-zephyr-setup@v1 + uses: zephyrproject-rtos/action-zephyr-setup@c125c5ebeeadbd727fa740b407f862734af1e52a # v1.0.9 with: app-path: application manifest-file-name: west_lite.yml diff --git a/.github/workflows/create_tag.yml b/.github/workflows/create_tag.yml index 7a90ea5f74..681e9a3b3a 100644 --- a/.github/workflows/create_tag.yml +++ b/.github/workflows/create_tag.yml @@ -29,7 +29,12 @@ jobs: contents: write # create and push tags steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # Full git history is needed to get a proper list of commits and tags with: fetch-depth: 0 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000000..973c6fd11a --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,27 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, +# surfacing known-vulnerable versions of the packages declared or updated in the PR. +# Once installed, if the workflow run is marked as required, +# PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - name: 'Checkout Repository' + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - name: 'Dependency Review' + uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2 diff --git a/.github/workflows/hadolint_dockerfiles.yml b/.github/workflows/hadolint_dockerfiles.yml index f9d8c38934..04aa355313 100644 --- a/.github/workflows/hadolint_dockerfiles.yml +++ b/.github/workflows/hadolint_dockerfiles.yml @@ -36,8 +36,13 @@ jobs: runs-on: ubuntu-22.04 steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # on default, hadolint will fail on warnings and errors - name: Run hadolint on dockerfiles diff --git a/.github/workflows/nightly_run.yml b/.github/workflows/nightly_run.yml index b2bd04d1d9..a913c676f1 100644 --- a/.github/workflows/nightly_run.yml +++ b/.github/workflows/nightly_run.yml @@ -66,14 +66,19 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # since jobs.id can't contain the dot character # it is hard to use `format` to assemble the cache key - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -232,14 +237,19 @@ jobs: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # only download llvm cache when needed - name: Get LLVM libraries id: retrieve_llvm_libs if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS') - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -340,6 +350,11 @@ jobs: - make_options_run_mode: $FAST_JIT_BUILD_OPTIONS make_options_feature: "-DWAMR_BUILD_MULTI_MEMORY=1" steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Install dependencies run: | apt update && apt install -y make g++-4.8 gcc-4.8 wget git @@ -386,13 +401,18 @@ jobs: - make_options: $MULTI_TIER_JIT_BUILD_OPTIONS sanitizer: asan steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Get LLVM libraries id: retrieve_llvm_libs if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS')) - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -439,8 +459,13 @@ jobs: - os: ubuntu-22.04 llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu.outputs.cache_key }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -449,7 +474,7 @@ jobs: - name: Get LLVM libraries id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -568,6 +593,14 @@ jobs: ./shared_heap_test ./shared_heap_test --aot + - name: Build Sample [import-func-callback] + run: | + cd samples/import-func-callback + mkdir build && cd build + cmake .. + cmake --build . --config Release --parallel 4 + ./import-func-callback + test: needs: [build_iwasm, build_llvm_libraries_on_ubuntu, build_wamrc] runs-on: ${{ matrix.os }} @@ -625,8 +658,13 @@ jobs: - running_mode: "fast-interp" sanitizer: ubsan steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt if: matrix.test_option == '$WASI_TEST_OPTIONS' @@ -655,7 +693,7 @@ jobs: - name: Get LLVM libraries if: env.USE_LLVM == 'true' id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin diff --git a/.github/workflows/release_process.yml b/.github/workflows/release_process.yml index bb99681dcb..c5862447ee 100644 --- a/.github/workflows/release_process.yml +++ b/.github/workflows/release_process.yml @@ -11,6 +11,26 @@ on: type: boolean required: false default: false + release_wamr_sdk: + description: "If the WAMR SDK in the release" + type: boolean + required: false + default: false + release_wamr_lldb: + description: "If the WAMR LLDB in the release" + type: boolean + required: false + default: false + release_wamr_ide_vscode_ext: + description: "If the WAMR VSCode extension in the release" + type: boolean + required: false + default: false + release_wamr_wasi_ext: + description: "If the WAMR WASI extensions in the release" + type: boolean + required: false + default: true # Cancel any in-flight jobs for the same PR/branch so there's only one active # at a time @@ -35,7 +55,12 @@ jobs: outputs: upload_url: ${{ steps.create_release.outputs.upload_url }} steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: prepare the release note run: | @@ -46,7 +71,7 @@ jobs: - name: create a release id: create_release - uses: actions/create-release@v1 + uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e # v1.1.4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -85,7 +110,7 @@ jobs: needs: [create_tag, create_release] uses: ./.github/workflows/build_llvm_libraries.yml with: - os: "windows-latest" + os: "windows-2022" arch: "AArch64 ARM Mips RISCV X86" # @@ -93,7 +118,7 @@ jobs: release_wamrc_on_ubuntu_2204: permissions: contents: write # upload release artifact - needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204 ] + needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204] uses: ./.github/workflows/build_wamrc.yml with: llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }} @@ -122,7 +147,7 @@ jobs: with: llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} release: true - runner: windows-latest + runner: windows-2022 upload_url: ${{ needs.create_release.outputs.upload_url }} ver_num: ${{ needs.create_tag.outputs.new_ver }} @@ -160,7 +185,7 @@ jobs: with: cwd: product-mini/platforms/windows llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} - runner: windows-latest + runner: windows-2022 upload_url: ${{ needs.create_release.outputs.upload_url }} ver_num: ${{ needs.create_tag.outputs.new_ver}} @@ -170,6 +195,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_sdk }} uses: ./.github/workflows/build_wamr_sdk.yml with: config_file: wamr_config_ubuntu_release.cmake @@ -183,6 +209,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_sdk }} uses: ./.github/workflows/build_wamr_sdk.yml with: config_file: wamr_config_macos_release.cmake @@ -192,30 +219,29 @@ jobs: wasi_sdk_url: https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/wasi-sdk-19.0-macos.tar.gz wamr_app_framework_url: https://github.com/bytecodealliance/wamr-app-framework.git - # Let's disable it for now and reopen it when the actual requirement arises. - # Please ensure all dependencies have been updated before reopening. + # vscode extension cross-platform + release_wamr_ide_vscode_ext: + permissions: + contents: write # upload release artifact + needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_ide_vscode_ext}} + uses: ./.github/workflows/build_wamr_vscode_ext.yml + secrets: inherit + with: + upload_url: ${{ needs.create_release.outputs.upload_url }} + ver_num: ${{ needs.create_tag.outputs.new_ver }} + # - # # vscode extension cross-platform - # release_wamr_ide_vscode_ext: - # permissions: - # contents: write # upload release artifact - # needs: [create_tag, create_release] - # uses: ./.github/workflows/build_wamr_vscode_ext.yml - # secrets: inherit - # with: - # upload_url: ${{ needs.create_release.outputs.upload_url }} - # ver_num: ${{ needs.create_tag.outputs.new_ver }} - - # # - # # vscode extension docker images package - # release_wamr_ide_docker_images_package: - # permissions: - # contents: write # upload release artifact - # needs: [create_tag, create_release] - # uses: ./.github/workflows/build_docker_images.yml - # with: - # upload_url: ${{ needs.create_release.outputs.upload_url }} - # ver_num: ${{ needs.create_tag.outputs.new_ver }} + # vscode extension docker images package + release_wamr_ide_docker_images_package: + permissions: + contents: write # upload release artifact + needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_ide_vscode_ext}} + uses: ./.github/workflows/build_docker_images.yml + with: + upload_url: ${{ needs.create_release.outputs.upload_url }} + ver_num: ${{ needs.create_tag.outputs.new_ver }} # # WAMR_LLDB @@ -223,6 +249,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_lldb }} uses: ./.github/workflows/build_wamr_lldb.yml with: runner: ubuntu-22.04 @@ -233,6 +260,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_lldb }} uses: ./.github/workflows/build_wamr_lldb.yml with: runner: macos-13 @@ -244,6 +272,7 @@ jobs: permissions: contents: write # upload release artifact needs: [create_tag, create_release] + if: ${{ inputs.release_wamr_wasi_ext }} uses: ./.github/workflows/build_wamr_wasi_extensions.yml with: upload_url: ${{ needs.create_release.outputs.upload_url }} diff --git a/.github/workflows/reuse_latest_release_binaries.yml b/.github/workflows/reuse_latest_release_binaries.yml index 77fe7329f5..a39f026276 100644 --- a/.github/workflows/reuse_latest_release_binaries.yml +++ b/.github/workflows/reuse_latest_release_binaries.yml @@ -34,7 +34,12 @@ jobs: contents: write # for creating realease and uploading release artifacts steps: - - uses: actions/checkout@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # Full git history is needed to get a proper list of commits and tags with: fetch-depth: 0 @@ -53,7 +58,7 @@ jobs: - name: upload release tar.gz if: steps.try_reuse.outputs.result == 'hit' - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -64,7 +69,7 @@ jobs: - name: upload release zip if: steps.try_reuse.outputs.result == 'hit' - uses: actions/upload-release-asset@v1 + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/spec_test_on_nuttx.yml b/.github/workflows/spec_test_on_nuttx.yml index 6c36c45ca3..f42fa9a1bd 100644 --- a/.github/workflows/spec_test_on_nuttx.yml +++ b/.github/workflows/spec_test_on_nuttx.yml @@ -142,22 +142,27 @@ jobs: steps: # Note: we use an unreleased version nuttx for xtensa because # 12.4 doesn't contain necessary esp32s3 changes. + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: Checkout NuttX - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx ref: ${{ matrix.target_config.target == 'xtensa' && '985d395b025cf2012b22f6bb4461959fa6d87645' || 'releases/12.9' }} path: nuttx - name: Checkout NuttX Apps - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: apache/nuttx-apps ref: ${{ matrix.target_config.target == 'xtensa' && '2ef3eb25c0cec944b13792185f7e5d5a05990d5f' || 'releases/12.9' }} path: apps - name: Checkout WAMR - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: ${{ github.repository }} path: apps/interpreters/wamr/wamr @@ -165,7 +170,7 @@ jobs: - name: Get LLVM libraries if: contains(matrix.wamr_test_option.mode, 'aot') id: retrieve_llvm_libs - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ./core/deps/llvm/build/bin @@ -329,7 +334,7 @@ jobs: - name: upload the log if: always() - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: spec-test-log-${{ github.run_id }}-${{ strategy.job-index }}-${{ matrix.target_config.target }} path: log diff --git a/.github/workflows/supply_chain.yml b/.github/workflows/supply_chain.yml index 9b2c3995f4..ebfa6edbfe 100644 --- a/.github/workflows/supply_chain.yml +++ b/.github/workflows/supply_chain.yml @@ -33,13 +33,18 @@ jobs: id-token: write steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: "Checkout code" - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v3.1.0 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2 + uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 with: results_file: results.sarif results_format: sarif @@ -52,7 +57,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v3.1.0 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v3.1.0 with: name: SARIF file path: results.sarif @@ -60,6 +65,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@7710ed11e398ea99c7f7004c2b2e0f580458db42 + uses: github/codeql-action/upload-sarif@338146ca93283a2901a142d408241096146019b5 with: sarif_file: results.sarif diff --git a/.github/workflows/wamr_wasi_extensions.yml b/.github/workflows/wamr_wasi_extensions.yml index e9d10fe93c..a5ab194925 100644 --- a/.github/workflows/wamr_wasi_extensions.yml +++ b/.github/workflows/wamr_wasi_extensions.yml @@ -29,8 +29,13 @@ jobs: matrix: os: [ubuntu-22.04, macos-13, macos-14] steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: install-wasi-sdk-wabt uses: ./.github/actions/install-wasi-sdk-wabt @@ -50,7 +55,7 @@ jobs: - name: Upload artifacts if: matrix.os == 'macos-14' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: wamr-wasi-extensions path: wamr-wasi-extensions/dist diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..073326191a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,30 @@ +repos: +- repo: https://github.com/gitleaks/gitleaks + rev: v8.16.3 + hooks: + - id: gitleaks +- repo: https://github.com/golangci/golangci-lint + rev: v1.52.2 + hooks: + - id: golangci-lint +- repo: https://github.com/jumanjihouse/pre-commit-hooks + rev: 3.0.0 + hooks: + - id: shellcheck +- repo: https://github.com/pocc/pre-commit-hooks + rev: v1.3.5 + hooks: + - id: cpplint +- repo: https://github.com/pre-commit/mirrors-eslint + rev: v8.38.0 + hooks: + - id: eslint +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace +- repo: https://github.com/pylint-dev/pylint + rev: v2.17.2 + hooks: + - id: pylint diff --git a/ADOPTERS.md b/ADOPTERS.md index ef112e9a12..8cdd82d5c9 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -26,6 +26,7 @@ _The list is in alphabetical order._ | Project | Reference | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [Apache Teaclave](https://github.com/apache/incubator-teaclave) | https://github.com/apache/incubator-teaclave/blob/master/docs/executing-wasm.md | +| [Edge Virtualization Platform](https://github.com/SonySemiconductorSolutions/edge-virtualization-platform) | https://github.com/SonySemiconductorSolutions/edge-virtualization-platform | | [Envoy](https://github.com/envoyproxy/envoy) | https://github.com/envoyproxy/envoy/blob/main/docs/root/configuration/other_features/wasm.rst | | [faasm](https://github.com/faasm/faasm) | https://github.com/faasm/faasm/blob/main/docs/source/wamr.md | | [fluent-bit](https://github.com/fluent/fluent-bit) | https://github.com/fluent/fluent-bit/tree/master/lib/wasm-micro-runtime-WAMR-1.3.0 | diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b28fa89c1..c33b211e61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,11 +126,9 @@ include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) if (NOT WIN32) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security \ -ffunction-sections -fdata-sections \ - -Wno-unused-parameter -Wno-pedantic \ -fvisibility=hidden") # Remove the extra spaces for better make log string (REGEX REPLACE " *" " " CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") endif() if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") diff --git a/README.md b/README.md index 859ee3540f..9d79661c8f 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ WebAssembly Micro Runtime (WAMR) is a lightweight standalone WebAssembly (Wasm) - [128-bit SIMD](https://github.com/WebAssembly/simd), ref to [samples/workload](samples/workload) - [Reference Types](https://github.com/WebAssembly/reference-types), ref to [document](doc/ref_types.md) and [sample](samples/ref-types) - [Bulk memory operations](https://github.com/WebAssembly/bulk-memory-operations), [Shared memory](https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#shared-linear-memory), [Memory64](https://github.com/WebAssembly/memory64) -- [Tail-call](https://github.com/WebAssembly/tail-call), [Garbage Collection](https://github.com/WebAssembly/gc), [Exception Handling](https://github.com/WebAssembly/exception-handling) +- [Tail-call](https://github.com/WebAssembly/tail-call), [Garbage Collection](https://github.com/WebAssembly/gc), [Exception Handling](https://github.com/WebAssembly/exception-handling), [Branch Hinting](https://github.com/WebAssembly/branch-hinting) - [Extended Constant Expressions](https://github.com/WebAssembly/extended-const) ### Supported architectures and platforms @@ -117,4 +117,3 @@ Any contributions you make will be under the same license. - [WAMR Blogs](https://bytecodealliance.github.io/wamr.dev/blog/) - [Community news and events](https://bytecodealliance.github.io/wamr.dev/events/) - [WAMR TSC meetings](https://github.com/bytecodealliance/wasm-micro-runtime/wiki/TSC-meeting-notes) - diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 4904d39492..56455b8742 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,35 @@ +## WAMR-2.4.3 + +### Breaking Changes + +### New Features + +### Bug Fixes + +- libc-wasi: add missing pointer validations to socket functions (#4611) (#4665) + +### Enhancements + +### Others + +--- + +## WAMR-2.4.2 + +### Breaking Changes + +### New Features + +### Bug Fixes + +- CVE-2025-58749. Fix a potential hang issue in LLVMJIT mode + +### Enhancements + +### Others + +--- + ## WAMR-2.4.1 ### Breaking Changes diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000000..ea0d9a3040 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,90 @@ +# Summary: structure of chapters and subchapters of the book + +* [WAMR Document Home Page](gitbook/home_page.md) + +## Basics + +* [Introduction](gitbook/basics/introduction/README.md) + * [WebAssembly](gitbook/basics/introduction/webassembly.md) + * [WAMR Project](gitbook/basics/introduction/wamr_project.md) + * [Security Feature](gitbook/basics/introduction/security_feature.md) + +* [Getting Started](gitbook/basics/getting-started/README.md) + * [Host Environment Preparation](gitbook/basics/getting-started/host_prerequsites.md) + * [Hello-world Program On Host](gitbook/basics/getting-started/on_host.md) + * [Docker Environment Preparation](doc/devcontainer.md) + * [Hello-world Program On Docker](gitbook/basics/getting-started/on_docker.md) + * [Build And Run WASM Application](doc/build_wasm_app.md) + * [More Tools To Create WASM Application](doc/other_wasm_compilers.md) + +## WAMR In Practice + +* [Tutorial](gitbook/tutorial/README.md) + * [WAMR Running Modes](gitbook/tutorial/running-modes/README.md) + * [Build Tutorial](gitbook/tutorial/build-tutorial/README.md) + * [Build iwasm](doc/build_wamr.md) + * [Build wamrc](gitbook/tutorial/build-tutorial/build_wamrc.md) + * [Language Embedding](gitbook/tutorial/language-embedding/README.md) + * [C/C++](doc/embed_wamr.md) + * [Python](language-bindings/python/README.md) + * [Go](language-bindings/go/README.md) + * [Debugging & IDE Support](gitbook/tutorial/debugging%26IDE-support/README.md) + * [WAMR Source Debugging With LLDB](doc/source_debugging.md) + * [VS Code Support](test-tools/wamr-ide/README.md) + * [Enable Debugging In VS Code](test-tools/wamr-ide/VSCode-Extension/README.md) + * [Move LLDB Binaries](test-tools/wamr-ide/VSCode-Extension/resource/debug/README.md) + +* [Advance Tutorial](gitbook/advance-tutorial/README.md) + * [Performance Test](gitbook/advance-tutorial/performance-benchmark/README.md) + * [PolyBench](tests/benchmarks/polybench/README.md) + * [CoreMark](tests/benchmarks/coremark/README.md) + * [Sightglass](tests/benchmarks/sightglass/README.md) + * [JetStream2](tests/benchmarks/jetstream/README.md) + * [Memory Usage Tunning](doc/memory_tune.md) + * [WAMR Porting Guide](doc/port_wamr.md) + +* [Features](gitbook/features/README.md) + * [Export Native APIs To WASM Applications](doc/export_native_api.md) + * [Example 1: Export C Functions to WASM](samples/basic/README.md) + * [Example 2: Using "native-lib"](samples/native-lib/README.md) + * [Multiple Modules As Dependencies](doc/multi_module.md) + * [Multi-modules Example](samples/multi-module/README.md) + * [Multi-thread, Pthread APIs And Thread Management](doc/pthread_library.md) + * [Multi-thread Example](samples/multi-thread/README.md) + * [Linux SGX(Intel Software Guard Extension) Support](doc/linux_sgx.md) + * [Linux SGX Remote Attestation](samples/sgx-ra/README.md) + * [XIP(Execution In Place) Support](doc/xip.md) + * [Socket Support](doc/socket_api.md) + * [Example: Use Socket Api in WAMR](samples/socket-api/README.md) + * [Post-MVP Features](gitbook/features/demo-examples/README.md) + * [WASM C API](samples/wasm-c-api/README.md) + * [128-bit SIMD](samples/workload/README.md) + * [Reference Types](samples/ref-types/README.md) + +* [More Examples](gitbook/examples/README.md) + * [File Interaction Of WASI](samples/file/README.md) + * [Same WASM Program Executing Concurrently](samples/spawn-thread/README.md) + * [Build And Run Workload](samples/workload/README.md) + +* [User Case](gitbook/features/user-case/README.md) + +## Programmer's Manual + +* [Programmer's Manual](gitbook/programmer's-manual/README.md) + * [C API Lists](gitbook/programmer's-manual/C_API_Lists.md) + +## Community + +* [How To Contribute](CONTRIBUTING.md) + +* [WAMR On Github](https://github.com/bytecodealliance/wasm-micro-runtime) + +* [WAMR Blogs](https://bytecodealliance.github.io/wamr.dev/) + +## Appendix + +* [Appendix A. Background Knowledge And Glossary Of Terms](gitbook/appendix/background_knowledge.md) + +* [Appendix B. WebAssembly Details](gitbook/appendix/webassembly_details.md) + +* [Appendix C. Complete WAMR Guide](README.md) diff --git a/build-scripts/code_coverage.cmake b/build-scripts/code_coverage.cmake new file mode 100644 index 0000000000..e122201df0 --- /dev/null +++ b/build-scripts/code_coverage.cmake @@ -0,0 +1,37 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +function(check_ubuntu_version) +# ubuntu 2204 is the recommended environment for collecting coverage data for now +# otherwise, there will be ERRORs, when using 2404, like below and +# +# geninfo: ERROR: ('mismatch') mismatched end line for _ZN63compilation_aot_emit_memory_test_aot_check_memory_overflow_Test8TestBodyEv at /workspaces/wasm-micro-runtime/tests/unit/compilation/aot_emit_memory_test.cc:96: 96 -> 106 +# (use "geninfo --ignore-errors mismatch,mismatch ..." to suppress this warning) +# geninfo: ERROR: ('negative') Unexpected negative count '-3' for /workspaces/wasm-micro-runtime/core/iwasm/interpreter/wasm_interp_classic.c:5473. +# Perhaps you need to compile with '-fprofile-update=atomic +# (use "geninfo --ignore-errors negative,negative ..." to suppress this warning) +# +# For sure, `--ignore-errors` can be used to ignore these errors, but better to use the recommended environment. + file(READ "/etc/os-release" OS_RELEASE_CONTENT) + string(REGEX MATCH "VERSION_ID=\"([0-9]+)\\.([0-9]+)\"" _ ${OS_RELEASE_CONTENT}) + if(NOT DEFINED CMAKE_MATCH_1 OR NOT DEFINED CMAKE_MATCH_2) + message(WARNING "Unable to detect Ubuntu version. Please ensure you are using Ubuntu 22.04.") + return() + endif() + + set(UBUNTU_MAJOR_VERSION ${CMAKE_MATCH_1}) + set(UBUNTU_MINOR_VERSION ${CMAKE_MATCH_2}) + + if(NOT (UBUNTU_MAJOR_VERSION EQUAL 22 AND UBUNTU_MINOR_VERSION EQUAL 04)) + message(WARNING "Ubuntu ${UBUNTU_MAJOR_VERSION}.${UBUNTU_MINOR_VERSION} detected. Ubuntu 22.04 is recommended for collecting coverage data.") + else() + message(STATUS "Ubuntu 22.04 detected. Proceeding with coverage data collection.") + endif() +endfunction() + +check_ubuntu_version() + +# add compile options for code coverage globally +add_compile_options(--coverage -O0 -g) +link_libraries(gcov) +add_definitions (-DCOLLECT_CODE_COVERAGE) diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 8cdce4a017..c087a0e673 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -81,6 +81,8 @@ elseif (WAMR_BUILD_TARGET MATCHES "THUMB.*") set (CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-mthumb") endif () +include (${CMAKE_CURRENT_LIST_DIR}/warnings.cmake) + if (NOT WAMR_BUILD_INTERP EQUAL 1) if (NOT WAMR_BUILD_AOT EQUAL 1) message (FATAL_ERROR "-- WAMR Interpreter and AOT must be enabled at least one") @@ -99,6 +101,12 @@ if (WAMR_BUILD_JIT EQUAL 1) # Enable Lazy JIT by default set (WAMR_BUILD_LAZY_JIT 1) endif () + + # In Debug mode, always use release builds of pre-built dependency libraries + if (WAMR_BUILD_PLATFORM STREQUAL "windows" AND MSVC) + add_compile_options($<$:/MD>) + endif() + if (NOT DEFINED LLVM_DIR) set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/build") @@ -140,29 +148,59 @@ include (${WAMR_ROOT_DIR}/build-scripts/package.cmake) # Sanitizers if (NOT DEFINED WAMR_BUILD_SANITIZER) - set(WAMR_BUILD_SANITIZER $ENV{WAMR_BUILD_SANITIZER}) -endif () + set(WAMR_BUILD_SANITIZER "$ENV{WAMR_BUILD_SANITIZER}") +endif() -if (NOT DEFINED WAMR_BUILD_SANITIZER) - set(WAMR_BUILD_SANITIZER "") -elseif (WAMR_BUILD_SANITIZER STREQUAL "ubsan") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=alignment" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined") -elseif (WAMR_BUILD_SANITIZER STREQUAL "asan") - if (NOT WAMR_BUILD_JIT EQUAL 1) - set (ASAN_OPTIONS "verbosity=2 debug=true ") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=address -fno-sanitize-recover=all" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") +if (NOT WAMR_BUILD_SANITIZER STREQUAL "") + set(SUPPORTED_SANITIZERS "ubsan;asan;tsan;posan") + string(REPLACE "," ";" SANITIZER_LIST "${WAMR_BUILD_SANITIZER}") + + # Check uncompabile sanitizers + if("tsan" IN_LIST SANITIZER_LIST AND "asan" IN_LIST SANITIZER_LIST) + message(FATAL_ERROR "ThreadSanitizer (tsan) and AddressSanitizer (asan) cannot be used together!") endif() -elseif (WAMR_BUILD_SANITIZER STREQUAL "tsan") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=thread -fno-sanitize-recover=all" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread") -elseif (WAMR_BUILD_SANITIZER STREQUAL "posan") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=pointer-overflow -fno-sanitize-recover=all" ) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=pointer-overflow") -elseif (NOT (WAMR_BUILD_SANITIZER STREQUAL "") ) - message(SEND_ERROR "Unsupported sanitizer: ${WAMR_BUILD_SANITIZER}") -endif() + + # Check every sanitizer in the list + set(INVALID_SANITIZERS "") + list(REMOVE_DUPLICATES SANITIZER_LIST) + set(SANITIZER_FLAGS) + set(NO_SANITIZER_FLAGS) + foreach(sanitizer ${SANITIZER_LIST}) + string(STRIP "${sanitizer}" sanitizer) + if(NOT sanitizer IN_LIST SUPPORTED_SANITIZERS) + list(APPEND INVALID_SANITIZERS "${sanitizer}") + elseif(sanitizer STREQUAL "ubsan") + list(APPEND SANITIZER_FLAGS "undefined") + list(APPEND NO_SANITIZER_FLAGS "alignment") + elseif(sanitizer STREQUAL "asan") + if (NOT WAMR_BUILD_JIT EQUAL 1) + set(ENV{ASAN_OPTIONS} "verbosity=2 debug=true") + list(APPEND SANITIZER_FLAGS "address") + else() + message(WARNING "AddressSanitizer is not supported in LLVM JIT mode, skip it") + endif() + elseif(sanitizer STREQUAL "tsan") + list(APPEND SANITIZER_FLAGS "thread") + elseif(sanitizer STREQUAL "posan") + list(APPEND SANITIZER_FLAGS "pointer-overflow") + endif() + endforeach() + + if(INVALID_SANITIZERS) + message(FATAL_ERROR "Unsupported sanitizers: ${INVALID_SANITIZERS}") + endif() + # common flags for all sanitizers + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fno-sanitize-recover=all") + if(SANITIZER_FLAGS) + string(REPLACE ";" "," SANITIZER_FLAGS_STR "${SANITIZER_FLAGS}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR}") + endif() + if(NO_SANITIZER_FLAGS) + string(REPLACE ";" "," NO_SANITIZER_FLAGS_STR "${NO_SANITIZER_FLAGS}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=${NO_SANITIZER_FLAGS_STR}") + endif() +endif () if (WAMR_BUILD_LINUX_PERF EQUAL 1) if (NOT WAMR_BUILD_JIT AND NOT WAMR_BUILD_AOT) @@ -183,6 +221,14 @@ if (NOT DEFINED WAMR_BUILD_BULK_MEMORY) set (WAMR_BUILD_BULK_MEMORY 1) endif () +if (NOT DEFINED WAMR_BUILD_BULK_MEMORY_OPT) + set (WAMR_BUILD_BULK_MEMORY_OPT 0) +endif () + +if (NOT DEFINED WAMR_BUILD_CALL_INDIRECT_OVERLONG) + set (WAMR_BUILD_CALL_INDIRECT_OVERLONG 0) +endif () + if (NOT DEFINED WAMR_BUILD_EXCE_HANDLING) set (WAMR_BUILD_EXCE_HANDLING 0) endif () @@ -215,10 +261,27 @@ if (NOT DEFINED WAMR_BUILD_EXTENDED_CONST_EXPR) set (WAMR_BUILD_EXTENDED_CONST_EXPR 0) endif () +if (NOT DEFINED WAMR_BUILD_LIME1) + set (WAMR_BUILD_LIME1 0) +endif () + ######################################## # Compilation options to marco ######################################## +if (WAMR_BUILD_LIME1 EQUAL 1) + set (WAMR_BUILD_BULK_MEMORY_OPT 1) + set (WAMR_BUILD_CALL_INDIRECT_OVERLONG 1) + set (WAMR_BUILD_EXTENDED_CONST_EXPR 1) +endif () + +if (WAMR_BUILD_BULK_MEMORY EQUAL 1) + set (WAMR_BUILD_BULK_MEMORY_OPT 1) +endif () +if (WAMR_BUILD_REF_TYPES EQUAL 1) + set (WAMR_BUILD_CALL_INDIRECT_OVERLONG 1) +endif () + message ("-- Build Configurations:") message (" Build as target ${WAMR_BUILD_TARGET}") message (" Build for platform ${WAMR_BUILD_PLATFORM}") @@ -328,6 +391,11 @@ if (WAMR_BUILD_BULK_MEMORY EQUAL 1) else () add_definitions (-DWASM_ENABLE_BULK_MEMORY=0) endif () +if (WAMR_BUILD_BULK_MEMORY_OPT EQUAL 1) + add_definitions (-DWASM_ENABLE_BULK_MEMORY_OPT=1) +else() + add_definitions (-DWASM_ENABLE_BULK_MEMORY_OPT=0) +endif () if (WAMR_BUILD_SHARED_MEMORY EQUAL 1) add_definitions (-DWASM_ENABLE_SHARED_MEMORY=1) message (" Shared memory enabled") @@ -419,6 +487,11 @@ endif () if (WAMR_BUILD_REF_TYPES EQUAL 1) add_definitions (-DWASM_ENABLE_REF_TYPES=1) endif () +if (WAMR_BUILD_CALL_INDIRECT_OVERLONG EQUAL 1) + add_definitions (-DWASM_ENABLE_CALL_INDIRECT_OVERLONG=1) +else () + add_definitions(-DWASM_ENABLE_CALL_INDIRECT_OVERLONG=0) +endif () if (WAMR_BUILD_GC EQUAL 1) if (WAMR_TEST_GC EQUAL 1) message(" GC testing enabled") @@ -510,7 +583,8 @@ if (WAMR_BUILD_WASI_NN EQUAL 1) # Variant backends if (NOT WAMR_BUILD_WASI_NN_TFLITE EQUAL 1 AND NOT WAMR_BUILD_WASI_NN_OPENVINO EQUAL 1 AND - NOT WAMR_BUILD_WASI_NN_LLAMACPP EQUAL 1) + NOT WAMR_BUILD_WASI_NN_LLAMACPP EQUAL 1 AND + NOT WAMR_BUILD_WASI_NN_ONNX EQUAL 1) message (FATAL_ERROR " Need to select a backend for WASI-NN") endif () @@ -526,6 +600,10 @@ if (WAMR_BUILD_WASI_NN EQUAL 1) message (" WASI-NN: backend llamacpp enabled") add_definitions (-DWASM_ENABLE_WASI_NN_LLAMACPP) endif () + if (WAMR_BUILD_WASI_NN_ONNX EQUAL 1) + message (" WASI-NN: backend onnx enabled") + add_definitions (-DWASM_ENABLE_WASI_NN_ONNX) + endif () # Variant devices if (WAMR_BUILD_WASI_NN_ENABLE_GPU EQUAL 1) message (" WASI-NN: GPU enabled") @@ -562,9 +640,7 @@ if (WAMR_BUILD_GC_HEAP_VERIFY EQUAL 1) message (" GC heap verification enabled") endif () if ("$ENV{COLLECT_CODE_COVERAGE}" STREQUAL "1" OR COLLECT_CODE_COVERAGE EQUAL 1) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") - add_definitions (-DCOLLECT_CODE_COVERAGE) + include(${CMAKE_CURRENT_LIST_DIR}/code_coverage.cmake) message (" Collect code coverage enabled") endif () if (WAMR_BUILD_STATIC_PGO EQUAL 1) @@ -684,6 +760,9 @@ else() message (" Extended constant expression disabled") add_definitions(-DWASM_ENABLE_EXTENDED_CONST_EXPR=0) endif () +if (WAMR_BUILD_LIME1 EQUAL 1) + message (" Lime1 enabled") +endif () ######################################## # Show Phase4 Wasm proposals status. ######################################## @@ -691,28 +770,30 @@ endif () message ( "-- About Wasm Proposals:\n" " Always-on:\n" +" \"Import/Export of Mutable Globals\"\n" " \"Multi-value\"\n" -" \"Non-trapping float-to-int conversions\"\n" -" \"Sign-extension operators\"\n" +" \"Non-trapping float-to-int Conversions\"\n" +" \"Sign-extension Operators\"\n" " \"WebAssembly C and C++ API\"\n" +" \"Branch Hinting\"\n" " Configurable. 0 is OFF. 1 is ON:\n" " \"Bulk Memory Operation\" via WAMR_BUILD_BULK_MEMORY: ${WAMR_BUILD_BULK_MEMORY}\n" +" \"Bulk-memory-opt\" via WAMR_BUILD_BULK_MEMORY_OPT: ${WAMR_BUILD_BULK_MEMORY_OPT}\n" +" \"Call-indirect-overlong\" via WAMR_BUILD_CALL_INDIRECT_OVERLONG: ${WAMR_BUILD_CALL_INDIRECT_OVERLONG}\n" " \"Extended Constant Expressions\" via WAMR_BUILD_EXTENDED_CONST_EXPR: ${WAMR_BUILD_EXTENDED_CONST_EXPR}\n" " \"Fixed-width SIMD\" via WAMR_BUILD_SIMD: ${WAMR_BUILD_SIMD}\n" -" \"Garbage collection\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" -" \"Legacy Exception handling\" via WAMR_BUILD_EXCE_HANDLING: ${WAMR_BUILD_EXCE_HANDLING}\n" +" \"Garbage Collection\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" +" \"Legacy Exception Handling\" via WAMR_BUILD_EXCE_HANDLING: ${WAMR_BUILD_EXCE_HANDLING}\n" " \"Memory64\" via WAMR_BUILD_MEMORY64: ${WAMR_BUILD_MEMORY64}\n" -" \"Multiple memories\" via WAMR_BUILD_MULTI_MEMORY: ${WAMR_BUILD_MULTI_MEMORY}\n" +" \"Multiple Memories\" via WAMR_BUILD_MULTI_MEMORY: ${WAMR_BUILD_MULTI_MEMORY}\n" " \"Reference Types\" via WAMR_BUILD_REF_TYPES: ${WAMR_BUILD_REF_TYPES}\n" " \"Reference-Typed Strings\" via WAMR_BUILD_STRINGREF: ${WAMR_BUILD_STRINGREF}\n" -" \"Tail call\" via WAMR_BUILD_TAIL_CALL: ${WAMR_BUILD_TAIL_CALL}\n" +" \"Tail Call\" via WAMR_BUILD_TAIL_CALL: ${WAMR_BUILD_TAIL_CALL}\n" " \"Threads\" via WAMR_BUILD_SHARED_MEMORY: ${WAMR_BUILD_SHARED_MEMORY}\n" " \"Typed Function References\" via WAMR_BUILD_GC: ${WAMR_BUILD_GC}\n" " Unsupported (>= Phase4):\n" -" \"Branch Hinting\"\n" " \"Custom Annotation Syntax in the Text Format\"\n" -" \"Exception handling\"\n" -" \"Import/Export of Mutable Globals\"\n" +" \"Exception Handling\"\n" " \"JS String Builtins\"\n" " \"Relaxed SIMD\"\n" ) diff --git a/build-scripts/requirements.txt b/build-scripts/requirements.txt index 480d0c4bbf..1e1bdeb6c6 100644 --- a/build-scripts/requirements.txt +++ b/build-scripts/requirements.txt @@ -1 +1 @@ -requests==2.32.4 \ No newline at end of file +requests==2.32.5 \ No newline at end of file diff --git a/build-scripts/runtime_lib.cmake b/build-scripts/runtime_lib.cmake index f7639f6a61..bac81c4f2d 100644 --- a/build-scripts/runtime_lib.cmake +++ b/build-scripts/runtime_lib.cmake @@ -162,8 +162,7 @@ endif () ####################### Common sources ####################### if (NOT MSVC) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections \ - -Wall -Wno-unused-parameter -Wno-pedantic") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections") endif () # include the build config template file diff --git a/build-scripts/version.cmake b/build-scripts/version.cmake index 637b3ba7b6..accbe5fd5a 100644 --- a/build-scripts/version.cmake +++ b/build-scripts/version.cmake @@ -8,7 +8,7 @@ endif() set(WAMR_VERSION_MAJOR 2) set(WAMR_VERSION_MINOR 4) -set(WAMR_VERSION_PATCH 1) +set(WAMR_VERSION_PATCH 3) message("-- WAMR version: ${WAMR_VERSION_MAJOR}.${WAMR_VERSION_MINOR}.${WAMR_VERSION_PATCH}") diff --git a/build-scripts/warnings.cmake b/build-scripts/warnings.cmake new file mode 100644 index 0000000000..fbe6966ccc --- /dev/null +++ b/build-scripts/warnings.cmake @@ -0,0 +1,46 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# global additional warnings. +if (MSVC) + # warning level 4 + add_compile_options(/W4) +else () + # refer to https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html + add_compile_options( + -Wall -Wextra -Wformat -Wformat-security + $<$:-Wshadow> + ) + # -pedantic causes warnings like "ISO C forbids initialization between function pointer and ‘void *’" which + # is widely used in the codebase. + # + # -fpermissive causes warnings like "-fpermissive is valid for C++/ObjC++ but not for C" + # + # Reference: + # - gcc-4.8 https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/Warning-Options.html + # - gcc-11.5 https://gcc.gnu.org/onlinedocs/gcc-11.5.0/gcc/Warning-Options.html + add_compile_options ( + $<$:-Wimplicit-function-declaration> + ) + + # https://gcc.gnu.org/gcc-5/changes.html introduces incompatible-pointer-types + # https://releases.llvm.org/7.0.0/tools/clang/docs/DiagnosticsReference.html#wincompatible-pointer-types + # is the earliest version that supports this option I can found. + # Assume AppClang versioning is compatible with Clang. + if ((CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "5.1") + OR (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0.0") + OR (CMAKE_C_COMPILER_ID STREQUAL "AppClang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0.0")) + add_compile_options($<$:-Wincompatible-pointer-types>) + endif() + + # options benefit embedded system. + add_compile_options ( + -Wdouble-promotion + ) + + # waivers + add_compile_options ( + -Wno-unused + -Wno-unused-parameter + ) +endif () diff --git a/core/config.h b/core/config.h index 3ee0b2cd92..cb5db1d0cf 100644 --- a/core/config.h +++ b/core/config.h @@ -214,6 +214,10 @@ #define WASM_ENABLE_BULK_MEMORY 0 #endif +#ifndef WASM_ENABLE_BULK_MEMORY_OPT +#define WASM_ENABLE_BULK_MEMORY_OPT 0 +#endif + /* Shared memory */ #ifndef WASM_ENABLE_SHARED_MEMORY #define WASM_ENABLE_SHARED_MEMORY 0 @@ -579,6 +583,14 @@ unless used elsewhere */ #define WASM_ENABLE_REF_TYPES 0 #endif +#ifndef WASM_ENABLE_CALL_INDIRECT_OVERLONG +#define WASM_ENABLE_CALL_INDIRECT_OVERLONG 0 +#endif + +#ifndef WASM_ENABLE_BRANCH_HINTS +#define WASM_ENABLE_BRANCH_HINTS 0 +#endif + #ifndef WASM_ENABLE_GC #define WASM_ENABLE_GC 0 #endif diff --git a/core/iwasm/aot/aot_intrinsic.c b/core/iwasm/aot/aot_intrinsic.c index a0e59e1d21..f296b4a25f 100644 --- a/core/iwasm/aot/aot_intrinsic.c +++ b/core/iwasm/aot/aot_intrinsic.c @@ -152,7 +152,7 @@ float64 aot_intrinsic_fmin_f64(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -174,7 +174,7 @@ float64 aot_intrinsic_fmax_f64(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else diff --git a/core/iwasm/aot/aot_loader.c b/core/iwasm/aot/aot_loader.c index 771ef87ff3..2f7e6c9f25 100644 --- a/core/iwasm/aot/aot_loader.c +++ b/core/iwasm/aot/aot_loader.c @@ -1786,7 +1786,8 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint32(buf, buf_end, j); #if WASM_ENABLE_AOT_VALIDATOR != 0 - if (j >= module->type_count) { + /* an equivalence type should be before the type it refers to */ + if (j >= i) { set_error_buf(error_buf, error_buf_size, "invalid type index"); goto fail; } @@ -1805,7 +1806,22 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint32(buf, buf_end, parent_type_idx); read_uint16(buf, buf_end, rec_count); read_uint16(buf, buf_end, rec_idx); - +#if WASM_ENABLE_AOT_VALIDATOR != 0 + if (rec_count > module->type_count) { + set_error_buf(error_buf, error_buf_size, "invalid rec count"); + goto fail; + } + if (rec_idx > i || rec_idx >= rec_count) { + set_error_buf(error_buf, error_buf_size, "invalid rec idx"); + goto fail; + } + if (parent_type_idx >= i) { + set_error_buf( + error_buf, error_buf_size, + "parent type index must be smaller than current type index"); + goto fail; + } +#endif if (type_flag == WASM_TYPE_FUNC) { AOTFuncType *func_type; @@ -1958,6 +1974,13 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, read_uint8(buf, buf_end, struct_type->fields[j].field_flags); read_uint8(buf, buf_end, field_type); +#if WASM_ENABLE_AOT_VALIDATOR != 0 + if (!is_valid_field_type(field_type)) { + set_error_buf(error_buf, error_buf_size, + "invalid field type"); + goto fail; + } +#endif struct_type->fields[j].field_type = field_type; struct_type->fields[j].field_size = field_size = (uint8)wasm_reftype_size(field_type); @@ -2054,13 +2077,6 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, AOTType *cur_type = module->types[j]; parent_type_idx = cur_type->parent_type_idx; if (parent_type_idx != (uint32)-1) { /* has parent */ -#if WASM_ENABLE_AOT_VALIDATOR != 0 - if (parent_type_idx >= module->type_count) { - set_error_buf(error_buf, error_buf_size, - "invalid parent type index"); - goto fail; - } -#endif AOTType *parent_type = module->types[parent_type_idx]; module->types[j]->parent_type = parent_type; @@ -2084,13 +2100,6 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, AOTType *cur_type = module->types[j]; parent_type_idx = cur_type->parent_type_idx; if (parent_type_idx != (uint32)-1) { /* has parent */ -#if WASM_ENABLE_AOT_VALIDATOR != 0 - if (parent_type_idx >= module->type_count) { - set_error_buf(error_buf, error_buf_size, - "invalid parent type index"); - goto fail; - } -#endif AOTType *parent_type = module->types[parent_type_idx]; /* subtyping has been checked during compilation */ bh_assert(wasm_type_is_subtype_of( @@ -3160,7 +3169,9 @@ str2uint64(const char *buf, uint64 *p_res) return true; } -#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ +#define R_X86_64_GOTPCRELX 41 /* relaxable GOTPCREL */ +#define R_X86_64_REX_GOTPCRELX 42 /* relaxable GOTPCREL with REX prefix */ static bool is_text_section(const char *section_name) @@ -3223,7 +3234,9 @@ do_text_relocation(AOTModule *module, AOTRelocationGroup *group, } #if (defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)) \ && !defined(BH_PLATFORM_WINDOWS) - if (relocation->relocation_type == R_X86_64_GOTPCREL) { + if (relocation->relocation_type == R_X86_64_GOTPCREL + || relocation->relocation_type == R_X86_64_GOTPCRELX + || relocation->relocation_type == R_X86_64_REX_GOTPCRELX) { GOTItem *got_item = module->got_item_list; uint32 got_item_idx = 0; @@ -3730,7 +3743,9 @@ load_relocation_section(const uint8 *buf, const uint8 *buf_end, bh_memcpy_s(symbol_name_buf, (uint32)sizeof(symbol_name_buf), symbol_name, symbol_name_len); - if (relocation.relocation_type == R_X86_64_GOTPCREL + if ((relocation.relocation_type == R_X86_64_GOTPCREL + || relocation.relocation_type == R_X86_64_GOTPCRELX + || relocation.relocation_type == R_X86_64_REX_GOTPCRELX) && !strncmp(symbol_name_buf, AOT_FUNC_PREFIX, strlen(AOT_FUNC_PREFIX))) { uint32 func_idx = @@ -3884,8 +3899,9 @@ load_relocation_section(const uint8 *buf, const uint8 *buf_end, || !strcmp(group->section_name, ".text") #endif ) { -#if !defined(BH_PLATFORM_LINUX) && !defined(BH_PLATFORM_LINUX_SGX) \ - && !defined(BH_PLATFORM_DARWIN) && !defined(BH_PLATFORM_WINDOWS) +#if !defined(BH_PLATFORM_LINUX) && !defined(BH_PLATFORM_LINUX_SGX) \ + && !defined(BH_PLATFORM_DARWIN) && !defined(BH_PLATFORM_WINDOWS) \ + && !defined(BH_PLATFORM_ANDROID) if (module->is_indirect_mode) { set_error_buf(error_buf, error_buf_size, "cannot apply relocation to text section " @@ -4210,15 +4226,7 @@ create_module(char *name, char *error_buf, uint32 error_buf_size) #endif #if WASM_ENABLE_LIBC_WASI != 0 -#if WASM_ENABLE_UVWASI == 0 - module->wasi_args.stdio[0] = os_invalid_raw_handle(); - module->wasi_args.stdio[1] = os_invalid_raw_handle(); - module->wasi_args.stdio[2] = os_invalid_raw_handle(); -#else - module->wasi_args.stdio[0] = os_get_invalid_handle(); - module->wasi_args.stdio[1] = os_get_invalid_handle(); - module->wasi_args.stdio[2] = os_get_invalid_handle(); -#endif /* WASM_ENABLE_UVWASI == 0 */ + wasi_args_set_defaults(&module->wasi_args); #endif /* WASM_ENABLE_LIBC_WASI != 0 */ return module; diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index d2621fb2fa..55c962f4a6 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c @@ -114,6 +114,13 @@ set_error_buf_v(char *error_buf, uint32 error_buf_size, const char *format, ...) } } +static void +aot_unlinked_import_func_trap(WASMExecEnv *exec_env) +{ + AOTModuleInstance *module_inst = (AOTModuleInstance *)exec_env->module_inst; + aot_set_exception_with_id(module_inst, EXCE_CALL_UNLINKED_IMPORT_FUNC); +} + static void * runtime_malloc(uint64 size, char *error_buf, uint32 error_buf_size) { @@ -1026,14 +1033,14 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModuleInstance *parent, /* If only one page and at most one page, we just append the app heap to the end of linear memory, enlarge the num_bytes_per_page, and don't change the page count */ - heap_offset = num_bytes_per_page; - num_bytes_per_page += heap_size; - if (num_bytes_per_page < heap_size) { + if (heap_size > UINT32_MAX - num_bytes_per_page) { set_error_buf(error_buf, error_buf_size, "failed to insert app heap into linear memory, " "try using `--heap-size=0` option"); return NULL; } + heap_offset = num_bytes_per_page; + num_bytes_per_page += heap_size; } else if (heap_size > 0) { if (init_page_count == max_page_count && init_page_count == 0) { @@ -1385,8 +1392,19 @@ init_func_ptrs(AOTModuleInstance *module_inst, AOTModule *module, if (!*func_ptrs) { const char *module_name = module->import_funcs[i].module_name; const char *field_name = module->import_funcs[i].func_name; + + /* AOT mode: If linking an imported function fails, we only issue + * a warning here instead of throwing an error. However, during the + * subsequent `invoke_native` stage, calling this unresolved import + * will likely crash. + * + * See: + * https://github.com/bytecodealliance/wasm-micro-runtime/issues/4539 + * + * Debugging: Check if the import is resolved at link time */ LOG_WARNING("warning: failed to link import function (%s, %s)", module_name, field_name); + *func_ptrs = (void *)aot_unlinked_import_func_trap; } } @@ -1879,8 +1897,9 @@ check_linked_symbol(AOTModule *module, char *error_buf, uint32 error_buf_size) AOTModuleInstance * aot_instantiate(AOTModule *module, AOTModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, uint32 error_buf_size) + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, + uint32 error_buf_size) { AOTModuleInstance *module_inst; #if WASM_ENABLE_BULK_MEMORY != 0 || WASM_ENABLE_REF_TYPES != 0 @@ -1898,6 +1917,9 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent, #if WASM_ENABLE_MULTI_MODULE != 0 bool ret = false; #endif + uint32 stack_size = args->v1.default_stack_size; + uint32 heap_size = args->v1.host_managed_heap_size; + uint32 max_memory_pages = args->v1.max_memory_pages; /* Align and validate heap size */ heap_size = align_uint(heap_size, 8); @@ -1979,7 +2001,7 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent, ret = wasm_runtime_sub_module_instantiate( (WASMModuleCommon *)module, (WASMModuleInstanceCommon *)module_inst, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); if (!ret) { LOG_DEBUG("build a sub module list failed"); goto fail; @@ -2460,6 +2482,14 @@ invoke_native_with_hw_bound_check(WASMExecEnv *exec_env, void *func_ptr, wasm_exec_env_push_jmpbuf(exec_env, &jmpbuf_node); + /* In AOT mode, this is primarily a design choice for performance reasons. + * Before invoke_native, we do not check whether every imported caller is + * NULL, unlike wasm_interp_call_func_import() and + * wasm_interp_call_func_native(). + * + * See: https://github.com/bytecodealliance/wasm-micro-runtime/issues/4539 + */ + if (os_setjmp(jmpbuf_node.jmpbuf) == 0) { #if WASM_ENABLE_QUICK_AOT_ENTRY != 0 /* Quick call if the quick aot entry is registered */ @@ -4477,7 +4507,7 @@ aot_create_call_stack(struct WASMExecEnv *exec_env) frame.frame_ref = (uint8 *)frame.lp + (frame_ref - (uint8 *)lp); /* copy local ref flags from AOT module */ bh_memcpy_s(frame.frame_ref, local_ref_flags_cell_num, - local_ref_flags, lp_size); + local_ref_flags, local_ref_flags_cell_num); #endif } @@ -4589,16 +4619,16 @@ aot_dump_perf_profiling(const AOTModuleInstance *module_inst) os_printf( " func %s, execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - func_name, perf_prof->total_exec_time / 1000.0f, + func_name, perf_prof->total_exec_time / 1000.0, perf_prof->total_exec_cnt, - perf_prof->children_exec_time / 1000.0f); + perf_prof->children_exec_time / 1000.0); else os_printf(" func %" PRIu32 ", execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - i, perf_prof->total_exec_time / 1000.0f, + i, perf_prof->total_exec_time / 1000.0, perf_prof->total_exec_cnt, - perf_prof->children_exec_time / 1000.0f); + perf_prof->children_exec_time / 1000.0); } } @@ -4614,7 +4644,7 @@ aot_summarize_wasm_execute_time(const AOTModuleInstance *inst) AOTFuncPerfProfInfo *perf_prof = (AOTFuncPerfProfInfo *)inst->func_perf_profilings + i; ret += (perf_prof->total_exec_time - perf_prof->children_exec_time) - / 1000.0f; + / 1000.0; } return ret; @@ -4633,7 +4663,7 @@ aot_get_wasm_func_exec_time(const AOTModuleInstance *inst, AOTFuncPerfProfInfo *perf_prof = (AOTFuncPerfProfInfo *)inst->func_perf_profilings + i; return (perf_prof->total_exec_time - perf_prof->children_exec_time) - / 1000.0f; + / 1000.0; } } diff --git a/core/iwasm/aot/aot_runtime.h b/core/iwasm/aot/aot_runtime.h index d06cd10812..687c75e142 100644 --- a/core/iwasm/aot/aot_runtime.h +++ b/core/iwasm/aot/aot_runtime.h @@ -544,10 +544,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func); * * @param module the AOT module to instantiate * @param parent the parent module instance - * @param heap_size the default heap size of the module instance, a heap will - * be created besides the app memory space. Both wasm app and native - * function can allocate memory from the heap. If heap_size is 0, the - * default heap size will be used. + * @param args the instantiation parameters * @param error_buf buffer to output the error info if failed * @param error_buf_size the size of the error buffer * @@ -555,8 +552,8 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func); */ AOTModuleInstance * aot_instantiate(AOTModule *module, AOTModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size); /** diff --git a/core/iwasm/aot/arch/aot_reloc_arc.c b/core/iwasm/aot/arch/aot_reloc_arc.c index 3329629987..2ce1154426 100644 --- a/core/iwasm/aot/arch/aot_reloc_arc.c +++ b/core/iwasm/aot/arch/aot_reloc_arc.c @@ -310,6 +310,80 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr, int32 symbol_index, char *error_buf, uint32 error_buf_size) { switch (reloc_type) { + case R_ARC_S21H_PCREL: + { + uint32 insn = LOAD_I32(target_section_addr + reloc_offset); + int32 addend, value; + uintptr_t S, P; + intptr_t A; + + CHECK_RELOC_OFFSET(sizeof(void *)); + + /* Convert from middle endian */ + insn = middle_endian_convert(insn); + + /* Extract the first 10 bits from Position 6 to 15 in insn */ + addend = (insn << 16) >> 22; + addend = addend << 10; + /* Extract the remaining 10 bits from Position 17 to 26 in insn */ + addend |= ((insn << 5) >> 22); + /* Fill in 1 bits to get the 21 bit Offset Value */ + addend = addend << 1; + + /* (S + A) - P */ + S = (uintptr_t)(uint8 *)symbol_addr; + A = (intptr_t)reloc_addend; + P = (uintptr_t)(target_section_addr + reloc_offset); + P &= (uintptr_t)~1; + value = (int32)(S + A + addend - P); + + insn = insn & 0xf801003f; + insn |= ((((value >> 1) & 0x3ff) << 17) + | (((value >> 1) & 0xffc00) >> 4)); + + /* Convert to middle endian */ + insn = middle_endian_convert(insn); + + STORE_U32(target_section_addr + reloc_offset, insn); + break; + } + case R_ARC_S21W_PCREL: + { + uint32 insn = LOAD_I32(target_section_addr + reloc_offset); + int32 addend, value; + uintptr_t S, P; + intptr_t A; + + CHECK_RELOC_OFFSET(sizeof(void *)); + + /* Convert from middle endian */ + insn = middle_endian_convert(insn); + + /* Extract the first 10 bits from Position 6 to 15 in insn */ + addend = (insn << 16) >> 22; + addend = addend << 9; + /* Extract the remaining 9 bits from Position 18 to 26 in insn */ + addend |= ((insn << 5) >> 23); + /* Fill in 2 bits to get the 21 bit Offset Value */ + addend = addend << 2; + + /* (S + A) - P */ + S = (uintptr_t)(uint8 *)symbol_addr; + A = (intptr_t)reloc_addend; + P = (uintptr_t)(target_section_addr + reloc_offset); + P &= (uintptr_t)~3; + value = (int32)(S + A + addend - P); + + insn = insn & 0xf803003f; + insn |= ((((value >> 2) & 0x1ff) << 18) + | (((value >> 2) & 0x7fe00) >> 3)); + + /* Convert to middle endian */ + insn = middle_endian_convert(insn); + + STORE_U32(target_section_addr + reloc_offset, insn); + break; + } case R_ARC_S25H_PCREL: { uint32 insn = LOAD_I32(target_section_addr + reloc_offset); @@ -340,8 +414,8 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr, insn = insn & 0xf8010030; insn |= ((((value >> 1) & 0x3ff) << 17) - | (((value >> 1) & 0xffc00) >> 3) - | (((value >> 1) & 0xf00000) >> 19)); + | (((value >> 1) & 0xffc00) >> 4) + | (((value >> 1) & 0xf00000) >> 20)); /* Convert to middle endian */ insn = middle_endian_convert(insn); diff --git a/core/iwasm/aot/arch/aot_reloc_x86_64.c b/core/iwasm/aot/arch/aot_reloc_x86_64.c index fe18d79c63..2f36c4c3bc 100644 --- a/core/iwasm/aot/arch/aot_reloc_x86_64.c +++ b/core/iwasm/aot/arch/aot_reloc_x86_64.c @@ -6,13 +6,15 @@ #include "aot_reloc.h" #if !defined(BH_PLATFORM_WINDOWS) -#define R_X86_64_64 1 /* Direct 64 bit */ -#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ -#define R_X86_64_PLT32 4 /* 32 bit PLT address */ -#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ -#define R_X86_64_32 10 /* Direct 32 bit zero extended */ -#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ -#define R_X86_64_PC64 24 /* PC relative 64 bit */ +#define R_X86_64_64 1 /* Direct 64 bit */ +#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ +#define R_X86_64_PLT32 4 /* 32 bit PLT address */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative offset to GOT */ +#define R_X86_64_32 10 /* Direct 32 bit zero extended */ +#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ +#define R_X86_64_PC64 24 /* PC relative 64 bit */ +#define R_X86_64_GOTPCRELX 41 /* relaxable GOTPCREL */ +#define R_X86_64_REX_GOTPCRELX 42 /* relaxable GOTPCREL with REX prefix */ #else #ifndef IMAGE_REL_AMD64_ADDR64 #define IMAGE_REL_AMD64_ADDR64 1 /* The 64-bit VA of the relocation target */ @@ -152,6 +154,8 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr, #if !defined(BH_PLATFORM_WINDOWS) case R_X86_64_PC32: case R_X86_64_GOTPCREL: /* GOT + G has been calculated as symbol_addr */ + case R_X86_64_GOTPCRELX: + case R_X86_64_REX_GOTPCRELX: { intptr_t target_addr = (intptr_t) /* S + A - P */ ((uintptr_t)symbol_addr + reloc_addend diff --git a/core/iwasm/common/arch/fneh.txt b/core/iwasm/common/arch/fneh.txt new file mode 100644 index 0000000000..965af94f2f --- /dev/null +++ b/core/iwasm/common/arch/fneh.txt @@ -0,0 +1,3 @@ +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_aarch64.s b/core/iwasm/common/arch/invokeNative_aarch64.s index f48a429c50..ea5d9c7490 100644 --- a/core/iwasm/common/arch/invokeNative_aarch64.s +++ b/core/iwasm/common/arch/invokeNative_aarch64.s @@ -79,3 +79,6 @@ return: add sp, sp, #0x30 /* restore sp */ ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_aarch64_simd.s b/core/iwasm/common/arch/invokeNative_aarch64_simd.s index f940c3403e..e1c7207624 100644 --- a/core/iwasm/common/arch/invokeNative_aarch64_simd.s +++ b/core/iwasm/common/arch/invokeNative_aarch64_simd.s @@ -77,3 +77,6 @@ return: add sp, sp, #0x30 /* restore sp */ ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_arc.s b/core/iwasm/common/arch/invokeNative_arc.s index e448eea650..e277dda03a 100644 --- a/core/iwasm/common/arch/invokeNative_arc.s +++ b/core/iwasm/common/arch/invokeNative_arc.s @@ -67,3 +67,6 @@ call_func: j_s [blink] /* ret */ nop_s +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_arm.s b/core/iwasm/common/arch/invokeNative_arm.s index bfe8e3b092..afcd51449a 100644 --- a/core/iwasm/common/arch/invokeNative_arm.s +++ b/core/iwasm/common/arch/invokeNative_arm.s @@ -73,3 +73,6 @@ return: add sp, sp, #4 ldmfd sp!, {r4, r5, r6, r7, lr} bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_arm_vfp.s b/core/iwasm/common/arch/invokeNative_arm_vfp.s index 19bc5d67cf..52d2a72588 100644 --- a/core/iwasm/common/arch/invokeNative_arm_vfp.s +++ b/core/iwasm/common/arch/invokeNative_arm_vfp.s @@ -84,3 +84,6 @@ return: ldmfd sp!, {r4, r5, r6, r7, lr} bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_armasm64.asm b/core/iwasm/common/arch/invokeNative_armasm64.asm new file mode 100644 index 0000000000..0abe160e61 --- /dev/null +++ b/core/iwasm/common/arch/invokeNative_armasm64.asm @@ -0,0 +1,73 @@ + ; Copyright (C) 2019 Intel Corporation. All rights reserved. + ; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + AREA |.text|, CODE, READONLY, ALIGN=2 + + EXPORT invokeNative + +; ------------------------ direct call path ------------------------ + +call_func + mov x20, x30 ; save x30(lr) + blr x19 + mov sp, x22 ; restore sp saved before function call + +return_label + mov x30, x20 ; restore x30(lr) + ldp x19, x20, [sp, #0x20] + ldp x21, x22, [sp, #0x10] + ldp x23, x24, [sp, #0x0] + add sp, sp, #0x30 + ret + +; ------------------------ stack-args path ------------------------ + +handle_stack + ; Reserve aligned stack space for stack arguments and copy them + mov x23, sp + bic sp, x23, #15 ; Ensure 16-byte alignment + lsl x23, x21, #3 ; x23 = nstacks * 8 + add x23, x23, #15 + bic x23, x23, #15 + sub sp, sp, x23 + mov x23, sp + +copy_loop + cmp x21, #0 + b.eq call_func ; when done, branch back to call path + ldr x24, [x20], #8 + str x24, [x23], #8 + sub x21, x21, #1 + b copy_loop + +; ------------------------ function entry ------------------------ + +invokeNative + sub sp, sp, #0x30 + stp x19, x20, [sp, #0x20] ; save the registers + stp x21, x22, [sp, #0x10] + stp x23, x24, [sp, #0x0] + + mov x19, x0 ; x19 = function ptr + mov x20, x1 ; x20 = argv + mov x21, x2 ; x21 = nstacks + mov x22, sp ; save the sp before call function + + ; Fill in floating-point registers + ldp d0, d1, [x20], #16 + ldp d2, d3, [x20], #16 + ldp d4, d5, [x20], #16 + ldp d6, d7, [x20], #16 + + ; Fill integer registers + ldp x0, x1, [x20], #16 ; x0 = argv[8] = exec_env, x1 = argv[9] + ldp x2, x3, [x20], #16 + ldp x4, x5, [x20], #16 + ldp x6, x7, [x20], #16 + + ; Now x20 points to stack args + cmp x21, #0 + b.ne handle_stack ; backward: there are stack args + b call_func ; backward: no stack args + + END diff --git a/core/iwasm/common/arch/invokeNative_armasm64_simd.asm b/core/iwasm/common/arch/invokeNative_armasm64_simd.asm new file mode 100644 index 0000000000..d209f10751 --- /dev/null +++ b/core/iwasm/common/arch/invokeNative_armasm64_simd.asm @@ -0,0 +1,73 @@ + ; Copyright (C) 2019 Intel Corporation. All rights reserved. + ; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + AREA |.text|, CODE, READONLY, ALIGN=2 + + EXPORT invokeNative + +; ------------------------ direct call path ------------------------ + +call_func + mov x20, x30 ; save x30(lr) + blr x19 + mov sp, x22 ; restore sp saved before function call + +return_label + mov x30, x20 ; restore x30(lr) + ldp x19, x20, [sp, #0x20] + ldp x21, x22, [sp, #0x10] + ldp x23, x24, [sp, #0x0] + add sp, sp, #0x30 + ret + +; ------------------------ stack-args path ------------------------ + +handle_stack + ; Reserve aligned stack space for stack arguments and copy them + mov x23, sp + bic sp, x23, #15 ; Ensure 16-byte alignment + lsl x23, x21, #3 ; x23 = nstacks * 8 + add x23, x23, #15 + bic x23, x23, #15 + sub sp, sp, x23 + mov x23, sp + +copy_loop + cmp x21, #0 + b.eq call_func ; when done, branch back to call path + ldr x24, [x20], #8 + str x24, [x23], #8 + sub x21, x21, #1 + b copy_loop + +; ------------------------ function entry ------------------------ + +invokeNative + sub sp, sp, #0x30 + stp x19, x20, [sp, #0x20] ; save the registers + stp x21, x22, [sp, #0x10] + stp x23, x24, [sp, #0x0] + + mov x19, x0 ; x19 = function ptr + mov x20, x1 ; x20 = argv + mov x21, x2 ; x21 = nstacks + mov x22, sp ; save the sp before call function + + ; Fill in floating-point registers + ; v0 = argv[0], v1 = argv[1], v2 = argv[2], v3 = argv[3] + ld1 {v0.2D, v1.2D, v2.2D, v3.2D}, [x20], #64 + ; v4 = argv[4], v5 = argv[5], v6 = argv[6], v7 = argv[7] + ld1 {v4.2D, v5.2D, v6.2D, v7.2D}, [x20], #64 + + ; Fill integer registers + ldp x0, x1, [x20], #16 ; x0 = argv[8] = exec_env, x1 = argv[9] + ldp x2, x3, [x20], #16 + ldp x4, x5, [x20], #16 + ldp x6, x7, [x20], #16 + + ; Now x20 points to stack args + cmp x21, #0 + b.ne handle_stack ; (backward) there are stack args + b call_func ; (backward) no stack args + + END diff --git a/core/iwasm/common/arch/invokeNative_em64.s b/core/iwasm/common/arch/invokeNative_em64.s index 739e84e4ce..fa34c2eeec 100644 --- a/core/iwasm/common/arch/invokeNative_em64.s +++ b/core/iwasm/common/arch/invokeNative_em64.s @@ -62,3 +62,6 @@ push_args_end: leave ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_em64_simd.s b/core/iwasm/common/arch/invokeNative_em64_simd.s index 0043ac9413..6c8d3febbc 100644 --- a/core/iwasm/common/arch/invokeNative_em64_simd.s +++ b/core/iwasm/common/arch/invokeNative_em64_simd.s @@ -62,3 +62,6 @@ push_args_end: leave ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_ia32.s b/core/iwasm/common/arch/invokeNative_ia32.s index de1c1a5e18..845cd93bf0 100644 --- a/core/iwasm/common/arch/invokeNative_ia32.s +++ b/core/iwasm/common/arch/invokeNative_ia32.s @@ -35,3 +35,6 @@ skip_push_args: leave ret +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_mips.s b/core/iwasm/common/arch/invokeNative_mips.s index 645f4f2ec4..d6e48114ea 100644 --- a/core/iwasm/common/arch/invokeNative_mips.s +++ b/core/iwasm/common/arch/invokeNative_mips.s @@ -72,3 +72,6 @@ done: j $31 .end invokeNative +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_osx_universal.s b/core/iwasm/common/arch/invokeNative_osx_universal.s index e2ca654fdf..fadaae5646 100644 --- a/core/iwasm/common/arch/invokeNative_osx_universal.s +++ b/core/iwasm/common/arch/invokeNative_osx_universal.s @@ -15,4 +15,4 @@ #else #include "invokeNative_em64_simd.s" #endif -#endif \ No newline at end of file +#endif diff --git a/core/iwasm/common/arch/invokeNative_thumb.s b/core/iwasm/common/arch/invokeNative_thumb.s index 3669fe77ed..8087c63b8e 100644 --- a/core/iwasm/common/arch/invokeNative_thumb.s +++ b/core/iwasm/common/arch/invokeNative_thumb.s @@ -89,3 +89,6 @@ return: pop {r4, r5, r6, r7} mov lr, r3 bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_thumb_vfp.s b/core/iwasm/common/arch/invokeNative_thumb_vfp.s index 3f12b91d3f..1bad1a6a88 100644 --- a/core/iwasm/common/arch/invokeNative_thumb_vfp.s +++ b/core/iwasm/common/arch/invokeNative_thumb_vfp.s @@ -98,3 +98,6 @@ return: mov lr, r3 bx lr +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/arch/invokeNative_xtensa.s b/core/iwasm/common/arch/invokeNative_xtensa.s index ce03f12c1c..9bc094d3ca 100644 --- a/core/iwasm/common/arch/invokeNative_xtensa.s +++ b/core/iwasm/common/arch/invokeNative_xtensa.s @@ -72,3 +72,6 @@ call_func: return: retw.n +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/core/iwasm/common/iwasm_common.cmake b/core/iwasm/common/iwasm_common.cmake index 15895b8e5e..c3653f156c 100644 --- a/core/iwasm/common/iwasm_common.cmake +++ b/core/iwasm/common/iwasm_common.cmake @@ -4,6 +4,42 @@ set (IWASM_COMMON_DIR ${CMAKE_CURRENT_LIST_DIR}) include_directories (${IWASM_COMMON_DIR}) +if (MSVC AND WAMR_BUILD_PLATFORM STREQUAL "windows" AND WAMR_BUILD_TARGET MATCHES "AARCH64.*") + if (DEFINED ENV{VCToolsInstallDir}) + # Detect host tool dir + set(_ARMASM64_CANDIDATES + "$ENV{VCToolsInstallDir}/bin/HostX64/ARM64/armasm64.exe" + "$ENV{VCToolsInstallDir}/bin/HostARM64/arm64/armasm64.exe") + set(_ARMASM64_EXE "") + foreach(_p IN LISTS _ARMASM64_CANDIDATES) + if (EXISTS "${_p}") + set(_ARMASM64_EXE "${_p}") + break() + endif() + endforeach() + if (_ARMASM64_EXE STREQUAL "") + message(FATAL_ERROR "armasm64.exe not found under VCToolsInstallDir") + endif() + + # Wrapper without spaces to avoid quoting hell on NMake/cmd.exe + set(_WRAP "${CMAKE_BINARY_DIR}/armasm64_wrapper.bat") + file(WRITE "${_WRAP}" +"@echo off\r\n\"${_ARMASM64_EXE}\" %*\r\n") + + # Use wrapper as compiler (no spaces in path) + set(CMAKE_ASM_MASM_COMPILER + "${_WRAP}" + CACHE FILEPATH "" FORCE) + + # Quote ONLY object and source (compiler path has no spaces now) + set(CMAKE_ASM_MASM_COMPILE_OBJECT + " /nologo -o \"\" \"\"" + CACHE STRING "" FORCE) + + else() + message(FATAL_ERROR "VCToolsInstallDir is not defined. Please run from a Developer Command Prompt or specify armasm64.exe manually.") + endif() +endif() add_definitions(-DBH_MALLOC=wasm_runtime_malloc) add_definitions(-DBH_FREE=wasm_runtime_free) @@ -79,9 +115,37 @@ elseif (WAMR_BUILD_TARGET MATCHES "THUMB.*") endif () elseif (WAMR_BUILD_TARGET MATCHES "AARCH64.*") if (NOT WAMR_BUILD_SIMD EQUAL 1) - set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64.s) + if (WAMR_BUILD_PLATFORM STREQUAL "windows") + if (MSVC) + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64.asm) + set(_WAMR_ARM64_MASM_SOURCES ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64.asm) + set_source_files_properties(${_WAMR_ARM64_MASM_SOURCES} + PROPERTIES + LANGUAGE ASM_MASM + COMPILE_DEFINITIONS "" + INCLUDE_DIRECTORIES "" + COMPILE_OPTIONS "/nologo" + ) + endif () + else () + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64.s) + endif () else() - set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64_simd.s) + if (WAMR_BUILD_PLATFORM STREQUAL "windows") + if (MSVC) + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64_simd.asm) + set(_WAMR_ARM64_MASM_SOURCES_SIMD ${IWASM_COMMON_DIR}/arch/invokeNative_armasm64_simd.asm) + set_source_files_properties(${_WAMR_ARM64_MASM_SOURCES_SIMD} + PROPERTIES + LANGUAGE ASM_MASM + COMPILE_DEFINITIONS "" + INCLUDE_DIRECTORIES "" + COMPILE_OPTIONS "/nologo" + ) + endif () + else () + set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_aarch64_simd.s) + endif () endif() elseif (WAMR_BUILD_TARGET STREQUAL "MIPS") set (source_all ${c_source_all} ${IWASM_COMMON_DIR}/arch/invokeNative_mips.s) diff --git a/core/iwasm/common/wasm_application.c b/core/iwasm/common/wasm_application.c index 85f3770f64..7bbd43d166 100644 --- a/core/iwasm/common/wasm_application.c +++ b/core/iwasm/common/wasm_application.c @@ -712,7 +712,10 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name, } case VALUE_TYPE_F32: { - os_printf("%.7g:f32", *(float32 *)(argv1 + k)); + // Explicit cast to double to avoid warning. + // Float arguments are promoted to double in variadic + // functions per section 6.5.2.2 of the C99 standard. + os_printf("%.7g:f32", (double)*(float32 *)(argv1 + k)); k++; break; } diff --git a/core/iwasm/common/wasm_loader_common.c b/core/iwasm/common/wasm_loader_common.c index 4243e9198b..397144e8e2 100644 --- a/core/iwasm/common/wasm_loader_common.c +++ b/core/iwasm/common/wasm_loader_common.c @@ -179,6 +179,20 @@ is_valid_func_type(const WASMFuncType *func_type) return true; } +bool +is_valid_packed_type(uint8 packed_type) +{ + return packed_type == PACKED_TYPE_I8 || packed_type == PACKED_TYPE_I16; +} + +bool +is_valid_field_type(uint8 field_type) +{ + if (is_valid_value_type(field_type) || is_valid_packed_type(field_type)) + return true; + return false; +} + /* * Indices are represented as a u32. */ diff --git a/core/iwasm/common/wasm_loader_common.h b/core/iwasm/common/wasm_loader_common.h index d5394bf99f..1c4c393468 100644 --- a/core/iwasm/common/wasm_loader_common.h +++ b/core/iwasm/common/wasm_loader_common.h @@ -38,6 +38,12 @@ is_valid_value_type_for_interpreter(uint8 value_tpye); bool is_valid_func_type(const WASMFuncType *func_type); +bool +is_valid_packed_type(uint8 packed_type); + +bool +is_valid_field_type(uint8 field_type); + bool is_indices_overflow(uint32 import, uint32 other, char *error_buf, uint32 error_buf_size); diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 59d478c96f..10c651bc94 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -199,6 +199,8 @@ wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args) heap->heap_handle = NULL; heap->base_addr = init_args->pre_allocated_addr; + LOG_VERBOSE("Create preallocated shared heap %p with size %u", + heap->base_addr, size); } else { if (!(heap->heap_handle = @@ -225,6 +227,8 @@ wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args) LOG_WARNING("init share heap failed"); goto fail4; } + LOG_VERBOSE("Create pool shared heap %p with size %u", heap->base_addr, + size); } os_mutex_lock(&shared_heap_list_lock); @@ -509,6 +513,8 @@ wasm_runtime_attach_shared_heap_internal(WASMModuleInstanceCommon *module_inst, os_mutex_lock(&shared_heap_list_lock); shared_heap->attached_count++; os_mutex_unlock(&shared_heap_list_lock); + LOG_VERBOSE("Shared heap %p is attached to module instance %p", shared_heap, + module_inst); return true; } @@ -570,6 +576,7 @@ wasm_runtime_detach_shared_heap_internal(WASMModuleInstanceCommon *module_inst) e->shared_heap_base_addr_adj = NULL; } #endif /* end of WASM_ENABLE_AOT != 0 */ + LOG_VERBOSE("Shared heap is detached from module instance %p", module_inst); } void @@ -609,12 +616,12 @@ wasm_runtime_get_shared_heap(WASMModuleInstanceCommon *module_inst_comm) bool is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - bool is_memory64, uint64 app_offset, uint32 bytes) + bool is_memory64, uint64 app_offset, uint64 bytes) { WASMSharedHeap *heap = get_shared_heap(module_inst), *cur; uint64 shared_heap_start, shared_heap_end; - if (!heap) { + if (!heap || bytes > APP_HEAP_SIZE_MAX) { goto fail; } @@ -658,12 +665,12 @@ is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, static bool is_native_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - bool is_memory64, uint8 *addr, uint32 bytes) + bool is_memory64, uint8 *addr, uint64 bytes) { WASMSharedHeap *cur, *heap = get_shared_heap(module_inst); uintptr_t base_addr, addr_int, end_addr; - if (!heap) { + if (!heap || bytes > APP_HEAP_SIZE_MAX) { goto fail; } diff --git a/core/iwasm/common/wasm_memory.h b/core/iwasm/common/wasm_memory.h index 48bd2179fe..b79ed4a6cb 100644 --- a/core/iwasm/common/wasm_memory.h +++ b/core/iwasm/common/wasm_memory.h @@ -84,7 +84,7 @@ SET_LINEAR_MEMORY_SIZE(WASMMemoryInstance *memory, uint64 size) #if WASM_ENABLE_SHARED_HEAP != 0 bool is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - bool is_memory64, uint64 app_offset, uint32 bytes); + bool is_memory64, uint64 app_offset, uint64 bytes); WASMSharedHeap * wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args); diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c index 060bb2c3d3..42aa55db28 100644 --- a/core/iwasm/common/wasm_native.c +++ b/core/iwasm/common/wasm_native.c @@ -347,7 +347,8 @@ static dtor_t g_context_dtors[WASM_MAX_INSTANCE_CONTEXTS]; static void dtor_noop(WASMModuleInstanceCommon *inst, void *ctx) -{} +{ +} void * wasm_native_create_context_key(void (*dtor)(WASMModuleInstanceCommon *inst, @@ -485,7 +486,8 @@ wasm_native_init() || WASM_ENABLE_LIB_RATS != 0 || WASM_ENABLE_WASI_NN != 0 \ || WASM_ENABLE_APP_FRAMEWORK != 0 || WASM_ENABLE_LIBC_WASI != 0 \ || WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 \ - || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 \ + || WASM_ENABLE_SHARED_HEAP != 0 NativeSymbol *native_symbols; uint32 n_native_symbols; #endif @@ -602,7 +604,8 @@ wasm_native_init() || WASM_ENABLE_LIB_RATS != 0 || WASM_ENABLE_WASI_NN != 0 \ || WASM_ENABLE_APP_FRAMEWORK != 0 || WASM_ENABLE_LIBC_WASI != 0 \ || WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 \ - || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 \ + || WASM_ENABLE_SHARED_HEAP != 0 goto fail; #else return false; @@ -616,7 +619,8 @@ wasm_native_init() || WASM_ENABLE_LIB_RATS != 0 || WASM_ENABLE_WASI_NN != 0 \ || WASM_ENABLE_APP_FRAMEWORK != 0 || WASM_ENABLE_LIBC_WASI != 0 \ || WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 \ - || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + || WASM_ENABLE_WASI_NN != 0 || WASM_ENABLE_WASI_EPHEMERAL_NN != 0 \ + || WASM_ENABLE_SHARED_HEAP != 0 fail: wasm_native_destroy(); return false; diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c index 943b46fc4c..e6bde73637 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -582,7 +582,7 @@ wasm_runtime_env_init(void) static bool wasm_runtime_exec_env_check(WASMExecEnv *exec_env) { - return exec_env && exec_env->module_inst && exec_env->wasm_stack_size > 0 + return exec_env && exec_env->module_inst && exec_env->wasm_stack.top_boundary == exec_env->wasm_stack.bottom + exec_env->wasm_stack_size && exec_env->wasm_stack.top <= exec_env->wasm_stack.top_boundary; @@ -1623,41 +1623,45 @@ wasm_runtime_get_max_mem(uint32 max_memory_pages, uint32 module_init_page_count, WASMModuleInstanceCommon * wasm_runtime_instantiate_internal(WASMModuleCommon *module, WASMModuleInstanceCommon *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size) { #if WASM_ENABLE_INTERP != 0 if (module->module_type == Wasm_Module_Bytecode) return (WASMModuleInstanceCommon *)wasm_instantiate( (WASMModule *)module, (WASMModuleInstance *)parent, exec_env_main, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); #endif #if WASM_ENABLE_AOT != 0 if (module->module_type == Wasm_Module_AoT) return (WASMModuleInstanceCommon *)aot_instantiate( (AOTModule *)module, (AOTModuleInstance *)parent, exec_env_main, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); #endif set_error_buf(error_buf, error_buf_size, "Instantiate module failed, invalid module type"); return NULL; } +void +wasm_runtime_instantiation_args_set_defaults(struct InstantiationArgs2 *args) +{ + memset(args, 0, sizeof(*args)); +} + WASMModuleInstanceCommon * wasm_runtime_instantiate(WASMModuleCommon *module, uint32 stack_size, uint32 heap_size, char *error_buf, uint32 error_buf_size) { - return wasm_runtime_instantiate_internal(module, NULL, NULL, stack_size, - heap_size, 0, error_buf, - error_buf_size); -} - -static void -instantiation_args_set_defaults(struct InstantiationArgs2 *args) -{ - memset(args, 0, sizeof(*args)); + struct InstantiationArgs2 args; + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); + wasm_runtime_instantiation_args_set_host_managed_heap_size(&args, + heap_size); + return wasm_runtime_instantiate_internal(module, NULL, NULL, &args, + error_buf, error_buf_size); } WASMModuleInstanceCommon * @@ -1666,7 +1670,7 @@ wasm_runtime_instantiate_ex(WASMModuleCommon *module, uint32 error_buf_size) { struct InstantiationArgs2 v2; - instantiation_args_set_defaults(&v2); + wasm_runtime_instantiation_args_set_defaults(&v2); v2.v1 = *args; return wasm_runtime_instantiate_ex2(module, &v2, error_buf, error_buf_size); } @@ -1678,7 +1682,7 @@ wasm_runtime_instantiation_args_create(struct InstantiationArgs2 **p) if (args == NULL) { return false; } - instantiation_args_set_defaults(args); + wasm_runtime_instantiation_args_set_defaults(args); *p = args; return true; } @@ -1715,10 +1719,8 @@ wasm_runtime_instantiate_ex2(WASMModuleCommon *module, const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size) { - return wasm_runtime_instantiate_internal( - module, NULL, NULL, args->v1.default_stack_size, - args->v1.host_managed_heap_size, args->v1.max_memory_pages, error_buf, - error_buf_size); + return wasm_runtime_instantiate_internal(module, NULL, NULL, args, + error_buf, error_buf_size); } void @@ -3438,6 +3440,21 @@ wasm_runtime_module_dup_data(WASMModuleInstanceCommon *module_inst, #if WASM_ENABLE_LIBC_WASI != 0 +void +wasi_args_set_defaults(WASIArguments *args) +{ + memset(args, 0, sizeof(*args)); +#if WASM_ENABLE_UVWASI == 0 + args->stdio[0] = os_invalid_raw_handle(); + args->stdio[1] = os_invalid_raw_handle(); + args->stdio[2] = os_invalid_raw_handle(); +#else + args->stdio[0] = os_get_invalid_handle(); + args->stdio[1] = os_get_invalid_handle(); + args->stdio[2] = os_get_invalid_handle(); +#endif /* WASM_ENABLE_UVWASI == 0 */ +} + static WASIArguments * get_wasi_args_from_module(wasm_module_t module) { @@ -7651,9 +7668,8 @@ wasm_runtime_load_depended_module(const WASMModuleCommon *parent_module, bool wasm_runtime_sub_module_instantiate(WASMModuleCommon *module, WASMModuleInstanceCommon *module_inst, - uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, - uint32 error_buf_size) + const struct InstantiationArgs2 *args, + char *error_buf, uint32 error_buf_size) { bh_list *sub_module_inst_list = NULL; WASMRegisteredModule *sub_module_list_node = NULL; @@ -7681,8 +7697,7 @@ wasm_runtime_sub_module_instantiate(WASMModuleCommon *module, WASMModuleCommon *sub_module = sub_module_list_node->module; WASMModuleInstanceCommon *sub_module_inst = NULL; sub_module_inst = wasm_runtime_instantiate_internal( - sub_module, NULL, NULL, stack_size, heap_size, max_memory_pages, - error_buf, error_buf_size); + sub_module, NULL, NULL, args, error_buf, error_buf_size); if (!sub_module_inst) { LOG_DEBUG("instantiate %s failed", sub_module_list_node->module_name); diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h index 324620bef3..88af687447 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h @@ -616,6 +616,9 @@ struct InstantiationArgs2 { InstantiationArgs v1; }; +void +wasm_runtime_instantiation_args_set_defaults(struct InstantiationArgs2 *args); + /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN bool wasm_runtime_init(void); @@ -683,8 +686,8 @@ wasm_runtime_get_max_mem(uint32 max_memory_pages, uint32 module_init_page_count, WASMModuleInstanceCommon * wasm_runtime_instantiate_internal(WASMModuleCommon *module, WASMModuleInstanceCommon *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size); /* Internal API */ @@ -1064,9 +1067,8 @@ wasm_runtime_load_depended_module(const WASMModuleCommon *parent_module, bool wasm_runtime_sub_module_instantiate(WASMModuleCommon *module, WASMModuleInstanceCommon *module_inst, - uint32 stack_size, uint32 heap_size, - uint32 max_memory_pages, char *error_buf, - uint32 error_buf_size); + const struct InstantiationArgs2 *args, + char *error_buf, uint32 error_buf_size); void wasm_runtime_sub_module_deinstantiate(WASMModuleInstanceCommon *module_inst); #endif @@ -1118,6 +1120,9 @@ wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst); WASM_RUNTIME_API_EXTERN uint32_t wasm_runtime_get_wasi_exit_code(WASMModuleInstanceCommon *module_inst); +void +wasi_args_set_defaults(WASIArguments *args); + bool wasm_runtime_init_wasi(WASMModuleInstanceCommon *module_inst, const char *dir_list[], uint32 dir_count, diff --git a/core/iwasm/common/wasm_shared_memory.c b/core/iwasm/common/wasm_shared_memory.c index 2027a57200..c1aa18f5c3 100644 --- a/core/iwasm/common/wasm_shared_memory.c +++ b/core/iwasm/common/wasm_shared_memory.c @@ -249,10 +249,14 @@ map_try_release_wait_info(HashMap *wait_hash_map, AtomicWaitInfo *wait_info, #if WASM_ENABLE_SHARED_HEAP != 0 static bool is_native_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, - uint8 *addr, uint32 bytes) + uint8 *addr, uint64 bytes) { WASMSharedHeap *shared_heap = NULL; + if (bytes > APP_HEAP_SIZE_MAX) { + return false; + } + #if WASM_ENABLE_INTERP != 0 if (module_inst->module_type == Wasm_Module_Bytecode) { shared_heap = ((WASMModuleInstance *)module_inst)->e->shared_heap; diff --git a/core/iwasm/compilation/aot.c b/core/iwasm/compilation/aot.c index 5e1e554ac1..8e3eeec134 100644 --- a/core/iwasm/compilation/aot.c +++ b/core/iwasm/compilation/aot.c @@ -416,6 +416,9 @@ aot_create_funcs(const WASMModule *module, uint32 pointer_size) aot_func->local_types_wp = func->local_types; aot_func->code = func->code; aot_func->code_size = func->code_size; +#if WASM_ENABLE_BRANCH_HINTS != 0 + aot_func->code_body_begin = func->code_body_begin; +#endif /* Resolve local offsets */ for (j = 0; j < func_type->param_count; j++) { @@ -872,6 +875,10 @@ aot_create_comp_data(WASMModule *module, const char *target_arch, comp_data->name_section_buf_end = module->name_section_buf_end; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + comp_data->function_hints = module->function_hints; +#endif + aot_init_aux_data(comp_data, module); comp_data->wasm_module = module; diff --git a/core/iwasm/compilation/aot.h b/core/iwasm/compilation/aot.h index 973d198caa..f1ecccfb37 100644 --- a/core/iwasm/compilation/aot.h +++ b/core/iwasm/compilation/aot.h @@ -217,6 +217,9 @@ typedef struct AOTFunc { /* offset of each local, including function parameters and local variables */ uint16 *local_offsets; +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint8 *code_body_begin; +#endif } AOTFunc; typedef struct AOTCompData { @@ -296,6 +299,10 @@ typedef struct AOTCompData { #if WASM_ENABLE_DEBUG_AOT != 0 dwarf_extractor_handle_t extractor; #endif + +#if WASM_ENABLE_BRANCH_HINTS != 0 + struct WASMCompilationHint **function_hints; +#endif } AOTCompData; typedef struct AOTNativeSymbol { diff --git a/core/iwasm/compilation/aot_compiler.c b/core/iwasm/compilation/aot_compiler.c index 82f70ca3dc..29026e8008 100644 --- a/core/iwasm/compilation/aot_compiler.c +++ b/core/iwasm/compilation/aot_compiler.c @@ -1158,9 +1158,7 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) case WASM_OP_BR_IF: { - read_leb_uint32(frame_ip, frame_ip_end, br_depth); - if (!aot_compile_op_br_if(comp_ctx, func_ctx, br_depth, - &frame_ip)) + if (!aot_compile_op_br_if(comp_ctx, func_ctx, &frame_ip)) return false; break; } @@ -1238,8 +1236,8 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) uint32 tbl_idx; read_leb_uint32(frame_ip, frame_ip_end, type_idx); - - if (comp_ctx->enable_gc || comp_ctx->enable_ref_types) { + if (comp_ctx->enable_gc + || comp_ctx->enable_call_indirect_overlong) { read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); } else { @@ -2464,6 +2462,14 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) UINT8_MAX */ opcode = (uint8)opcode1; +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 + if (WASM_OP_MEMORY_COPY <= opcode + && opcode <= WASM_OP_MEMORY_FILL + && !comp_ctx->enable_bulk_memory_opt) { + goto unsupport_bulk_memory_opt; + } +#endif + #if WASM_ENABLE_BULK_MEMORY != 0 if (WASM_OP_MEMORY_INIT <= opcode && opcode <= WASM_OP_MEMORY_FILL @@ -2532,6 +2538,8 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) return false; break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { frame_ip += 2; @@ -2546,7 +2554,7 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) return false; break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { @@ -3973,6 +3981,13 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) return false; #endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 +unsupport_bulk_memory_opt: + aot_set_last_error("bulk memory opt instruction was found, " + "try enabling bulk-memory-opt or bulk-memory option"); + return false; +#endif + #if WASM_ENABLE_BULK_MEMORY != 0 unsupport_bulk_memory: aot_set_last_error("bulk memory instruction was found, " diff --git a/core/iwasm/compilation/aot_compiler.h b/core/iwasm/compilation/aot_compiler.h index 889e2304b5..70d01c578d 100644 --- a/core/iwasm/compilation/aot_compiler.h +++ b/core/iwasm/compilation/aot_compiler.h @@ -668,7 +668,7 @@ set_local_gc_ref(AOTCompFrame *frame, int n, LLVMValueRef value, uint8 ref_type) #define I32_CONST(v) LLVMConstInt(I32_TYPE, v, true) #define I64_CONST(v) LLVMConstInt(I64_TYPE, v, true) -#define F32_CONST(v) LLVMConstReal(F32_TYPE, v) +#define F32_CONST(v) LLVMConstReal(F32_TYPE, (double)(v)) #define F64_CONST(v) LLVMConstReal(F64_TYPE, v) #define I8_CONST(v) LLVMConstInt(INT8_TYPE, v, true) diff --git a/core/iwasm/compilation/aot_emit_control.c b/core/iwasm/compilation/aot_emit_control.c index 80e379513c..ce4c2e1bdb 100644 --- a/core/iwasm/compilation/aot_emit_control.c +++ b/core/iwasm/compilation/aot_emit_control.c @@ -12,6 +12,7 @@ #endif #include "../aot/aot_runtime.h" #include "../interpreter/wasm_loader.h" +#include "../common/wasm_loader_common.h" #if WASM_ENABLE_DEBUG_AOT != 0 #include "debug/dwarf_extractor.h" @@ -87,6 +88,15 @@ format_block_name(char *name, uint32 name_size, uint32 block_index, } \ } while (0) +#define BUILD_COND_BR_V(value_if, block_then, block_else, instr) \ + do { \ + if (!(instr = LLVMBuildCondBr(comp_ctx->builder, value_if, block_then, \ + block_else))) { \ + aot_set_last_error("llvm build cond br failed."); \ + goto fail; \ + } \ + } while (0) + #define SET_BUILDER_POS(llvm_block) \ LLVMPositionBuilderAtEnd(comp_ctx->builder, llvm_block) @@ -255,6 +265,36 @@ restore_frame_sp_for_op_end(AOTBlock *block, AOTCompFrame *aot_frame) aot_frame->sp = block->frame_sp_begin; } +#if WASM_ENABLE_BRANCH_HINTS != 0 +static void +aot_emit_branch_hint(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, + uint32 offset, LLVMValueRef br_if_instr) +{ + struct WASMCompilationHint *hint = func_ctx->function_hints; + while (hint != NULL) { + if (hint->type == WASM_COMPILATION_BRANCH_HINT + && ((struct WASMCompilationHintBranchHint *)hint)->offset + == offset) { + break; + } + hint = hint->next; + } + if (hint != NULL) { + // same weight llvm MDBuilder::createLikelyBranchWeights assigns + const uint32_t likely_weight = (1U << 20) - 1; + const uint32_t unlikely_weight = 1; + aot_set_cond_br_weights( + comp_ctx, br_if_instr, + ((struct WASMCompilationHintBranchHint *)hint)->is_likely + ? likely_weight + : unlikely_weight, + ((struct WASMCompilationHintBranchHint *)hint)->is_likely + ? unlikely_weight + : likely_weight); + } +} +#endif + static bool handle_next_reachable_block(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint8 **p_frame_ip) @@ -455,15 +495,17 @@ push_aot_block_to_stack_and_pass_params(AOTCompContext *comp_ctx, /* Create param phis */ for (i = 0; i < block->param_count; i++) { - SET_BUILDER_POS(block->llvm_entry_block); - snprintf(name, sizeof(name), "%s%d_phi%d", - block_name_prefix[block->label_type], block->block_index, - i); - if (!(block->param_phis[i] = LLVMBuildPhi( - comp_ctx->builder, TO_LLVM_TYPE(block->param_types[i]), - name))) { - aot_set_last_error("llvm build phi failed."); - goto fail; + if (block->llvm_entry_block) { + SET_BUILDER_POS(block->llvm_entry_block); + snprintf(name, sizeof(name), "%s%d_phi%d", + block_name_prefix[block->label_type], + block->block_index, i); + if (!(block->param_phis[i] = LLVMBuildPhi( + comp_ctx->builder, + TO_LLVM_TYPE(block->param_types[i]), name))) { + aot_set_last_error("llvm build phi failed."); + goto fail; + } } if (block->label_type == LABEL_TYPE_IF @@ -673,13 +715,31 @@ aot_compile_op_block(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, MOVE_BLOCK_AFTER(block->llvm_else_block, block->llvm_entry_block); /* Create condition br IR */ +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value, block->llvm_entry_block, + block->llvm_else_block, br_if_val); + const uint32 off = + *p_frame_ip - func_ctx->aot_func->code_body_begin; + aot_emit_branch_hint(comp_ctx, func_ctx, off, br_if_val); +#else BUILD_COND_BR(value, block->llvm_entry_block, block->llvm_else_block); +#endif } else { /* Create condition br IR */ +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value, block->llvm_entry_block, + block->llvm_end_block, br_if_val); + const uint32 off = + *p_frame_ip - func_ctx->aot_func->code_body_begin; + aot_emit_branch_hint(comp_ctx, func_ctx, off, br_if_val); +#else BUILD_COND_BR(value, block->llvm_entry_block, block->llvm_end_block); +#endif block->is_reachable = true; } if (!push_aot_block_to_stack_and_pass_params(comp_ctx, func_ctx, @@ -1026,8 +1086,7 @@ aot_compile_op_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, static bool aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, - uint32 br_depth, LLVMValueRef value_cmp, - uint8 **p_frame_ip) + LLVMValueRef value_cmp, uint8 **p_frame_ip) { AOTBlock *block_dst; LLVMValueRef value, *values = NULL; @@ -1036,6 +1095,17 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint32 i, param_index, result_index; uint64 size; + // ip is advanced by one byte for the opcode +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint32 instr_offset = + (*p_frame_ip - 0x1) - (func_ctx->aot_func->code_body_begin); +#else + uint32 instr_offset = 0; +#endif + uint64 br_depth; + if (!read_leb(p_frame_ip, *p_frame_ip + 5, 32, false, &br_depth, NULL, 0)) + return false; + if (!(block_dst = get_target_block(func_ctx, br_depth))) { return false; } @@ -1108,8 +1178,15 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, values = NULL; } +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value_cmp, block_dst->llvm_entry_block, + llvm_else_block, br_if_val); + aot_emit_branch_hint(comp_ctx, func_ctx, instr_offset, br_if_val); +#else BUILD_COND_BR(value_cmp, block_dst->llvm_entry_block, llvm_else_block); +#endif /* Move builder to else block */ SET_BUILDER_POS(llvm_else_block); @@ -1152,9 +1229,15 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, } /* Condition jump to end block */ +#if WASM_ENABLE_BRANCH_HINTS != 0 + LLVMValueRef br_if_val = NULL; + BUILD_COND_BR_V(value_cmp, block_dst->llvm_end_block, + llvm_else_block, br_if_val); + aot_emit_branch_hint(comp_ctx, func_ctx, instr_offset, br_if_val); +#else BUILD_COND_BR(value_cmp, block_dst->llvm_end_block, llvm_else_block); - +#endif /* Move builder to else block */ SET_BUILDER_POS(llvm_else_block); } @@ -1178,13 +1261,13 @@ aot_compile_conditional_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, bool aot_compile_op_br_if(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, - uint32 br_depth, uint8 **p_frame_ip) + uint8 **p_frame_ip) { LLVMValueRef value_cmp; POP_COND(value_cmp); - return aot_compile_conditional_br(comp_ctx, func_ctx, br_depth, value_cmp, + return aot_compile_conditional_br(comp_ctx, func_ctx, value_cmp, p_frame_ip); fail: return false; diff --git a/core/iwasm/compilation/aot_emit_control.h b/core/iwasm/compilation/aot_emit_control.h index fd538495d6..7ea527a20c 100644 --- a/core/iwasm/compilation/aot_emit_control.h +++ b/core/iwasm/compilation/aot_emit_control.h @@ -32,7 +32,7 @@ aot_compile_op_br(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, bool aot_compile_op_br_if(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, - uint32 br_depth, uint8 **p_frame_ip); + uint8 **p_frame_ip); bool aot_compile_op_br_table(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, diff --git a/core/iwasm/compilation/aot_emit_memory.c b/core/iwasm/compilation/aot_emit_memory.c index 0659c2b408..f5bd859df1 100644 --- a/core/iwasm/compilation/aot_emit_memory.c +++ b/core/iwasm/compilation/aot_emit_memory.c @@ -1481,12 +1481,12 @@ aot_compile_op_memory_grow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) return false; } -#if WASM_ENABLE_BULK_MEMORY != 0 || WASM_ENABLE_STRINGREF != 0 +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 || WASM_ENABLE_STRINGREF != 0 LLVMValueRef check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, LLVMValueRef offset, LLVMValueRef bytes) { - LLVMValueRef maddr, max_addr, cmp, cmp1; + LLVMValueRef maddr, max_addr, cmp, cmp1, offset1; LLVMValueRef mem_base_addr; LLVMBasicBlockRef block_curr = LLVMGetInsertBlock(comp_ctx->builder); LLVMBasicBlockRef check_succ; @@ -1539,8 +1539,18 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, if (mem_data_size > 0 && mem_offset + mem_len <= mem_data_size) { /* inside memory space */ /* maddr = mem_base_addr + moffset */ + /* Perform zero extension in advance to avoid LLVMBuildInBoundsGEP2 + * interpreting a negative address due to sign extension when + * mem_offset >= 2GiB */ + if (comp_ctx->pointer_size == sizeof(uint64)) { + offset1 = I64_CONST(mem_offset); + } + else { + offset1 = I32_CONST((uint32)mem_offset); + } + CHECK_LLVM_CONST(offset1); if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, - mem_base_addr, &offset, 1, + mem_base_addr, &offset1, 1, "maddr"))) { aot_set_last_error("llvm build add failed."); goto fail; @@ -1769,7 +1779,9 @@ aot_compile_op_data_drop(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, fail: return false; } +#endif /* end of WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 bool aot_compile_op_memory_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) { @@ -1931,7 +1943,7 @@ aot_compile_op_memory_fill(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) fail: return false; } -#endif /* end of WASM_ENABLE_BULK_MEMORY */ +#endif /* end of WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_SHARED_MEMORY != 0 bool diff --git a/core/iwasm/compilation/aot_emit_memory.h b/core/iwasm/compilation/aot_emit_memory.h index 1eb95993cb..5b87377beb 100644 --- a/core/iwasm/compilation/aot_emit_memory.h +++ b/core/iwasm/compilation/aot_emit_memory.h @@ -78,7 +78,9 @@ aot_compile_op_memory_init(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, bool aot_compile_op_data_drop(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint32 seg_index); +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 bool aot_compile_op_memory_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx); diff --git a/core/iwasm/compilation/aot_llvm.c b/core/iwasm/compilation/aot_llvm.c index 5190a39d4b..ab351e6d44 100644 --- a/core/iwasm/compilation/aot_llvm.c +++ b/core/iwasm/compilation/aot_llvm.c @@ -1963,6 +1963,13 @@ aot_create_func_context(const AOTCompData *comp_data, AOTCompContext *comp_ctx, goto fail; } +#if WASM_ENABLE_BRANCH_HINTS != 0 + func_ctx->function_hints = + comp_ctx->comp_data->function_hints + ? comp_ctx->comp_data->function_hints[func_index] + : NULL; +#endif + return func_ctx; fail: @@ -2724,6 +2731,9 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) if (option->enable_bulk_memory) comp_ctx->enable_bulk_memory = true; + if (option->enable_bulk_memory_opt) + comp_ctx->enable_bulk_memory_opt = true; + if (option->enable_thread_mgr) comp_ctx->enable_thread_mgr = true; @@ -2733,6 +2743,9 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) if (option->enable_ref_types) comp_ctx->enable_ref_types = true; + if (option->enable_call_indirect_overlong) + comp_ctx->enable_call_indirect_overlong = true; + comp_ctx->aux_stack_frame_type = option->aux_stack_frame_type; comp_ctx->call_stack_features = option->call_stack_features; @@ -3317,7 +3330,7 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) /* Return error if ref-types and GC are disabled by command line but ref-types instructions are used */ - if (!option->enable_ref_types && !option->enable_gc + if (!option->enable_call_indirect_overlong && !option->enable_gc && wasm_module->is_ref_types_used) { aot_set_last_error("ref-types instruction was found, " "try removing --disable-ref-types option " @@ -3331,9 +3344,13 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) } if (!wasm_module->is_ref_types_used) { option->enable_ref_types = comp_ctx->enable_ref_types = false; + option->enable_call_indirect_overlong = + comp_ctx->enable_call_indirect_overlong = false; } if (!wasm_module->is_bulk_memory_used) { option->enable_bulk_memory = comp_ctx->enable_bulk_memory = false; + option->enable_bulk_memory_opt = comp_ctx->enable_bulk_memory_opt = + false; } #endif diff --git a/core/iwasm/compilation/aot_llvm.h b/core/iwasm/compilation/aot_llvm.h index 9f62f66162..5bd75a38ce 100644 --- a/core/iwasm/compilation/aot_llvm.h +++ b/core/iwasm/compilation/aot_llvm.h @@ -270,6 +270,9 @@ typedef struct AOTFuncContext { #if WASM_ENABLE_DEBUG_AOT != 0 LLVMMetadataRef debug_func; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + struct WASMCompilationHint *function_hints; +#endif unsigned int stack_consumption_for_func_call; @@ -413,6 +416,10 @@ typedef struct AOTCompContext { /* Bulk memory feature */ bool enable_bulk_memory; + /* Bulk memory opt feature. will be enabled alongside the + * enable_bulk_memory */ + bool enable_bulk_memory_opt; + /* Boundary Check */ bool enable_bound_check; @@ -449,6 +456,9 @@ typedef struct AOTCompContext { /* Reference Types */ bool enable_ref_types; + /* Call Indirect Overlong. will be enabled alongside the enable_ref_types */ + bool enable_call_indirect_overlong; + /* Disable LLVM built-in intrinsics */ bool disable_llvm_intrinsics; diff --git a/core/iwasm/compilation/aot_llvm_extra2.cpp b/core/iwasm/compilation/aot_llvm_extra2.cpp index 5e1fdf6ce6..bc49c54bbb 100644 --- a/core/iwasm/compilation/aot_llvm_extra2.cpp +++ b/core/iwasm/compilation/aot_llvm_extra2.cpp @@ -157,8 +157,13 @@ LLVMCreateTargetMachineWithOpts(LLVMTargetRef ctarget, const char *triple, auto ol = convert(opt_level); bool jit; auto cm = convert(code_model, &jit); +#if LLVM_VERSION_MAJOR >= 21 + auto targetmachine = target->createTargetMachine( + llvm::Triple(triple), cpu, features, opts, rm, cm, ol, jit); +#else auto targetmachine = target->createTargetMachine(triple, cpu, features, opts, rm, cm, ol, jit); +#endif #if LLVM_VERSION_MAJOR >= 18 // always place data in normal data section. // diff --git a/core/iwasm/compilation/simd/simd_common.c b/core/iwasm/compilation/simd/simd_common.c index 95bcdfdb04..c495ee4104 100644 --- a/core/iwasm/compilation/simd/simd_common.c +++ b/core/iwasm/compilation/simd/simd_common.c @@ -137,7 +137,7 @@ simd_build_splat_const_float_vector(const AOTCompContext *comp_ctx, return NULL; } - if (!(element = LLVMConstReal(element_type, element_value))) { + if (!(element = LLVMConstReal(element_type, (double)element_value))) { HANDLE_FAILURE("LLVMConstReal"); goto fail; } diff --git a/core/iwasm/fast-jit/fe/jit_emit_memory.c b/core/iwasm/fast-jit/fe/jit_emit_memory.c index bbe82cf674..07269a6551 100644 --- a/core/iwasm/fast-jit/fe/jit_emit_memory.c +++ b/core/iwasm/fast-jit/fe/jit_emit_memory.c @@ -713,7 +713,9 @@ jit_compile_op_data_drop(JitCompContext *cc, uint32 seg_idx) return jit_emit_callnative(cc, wasm_data_drop, 0, args, sizeof(args) / sizeof(args[0])); } +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 static int wasm_copy_memory(WASMModuleInstance *inst, uint32 src_mem_idx, uint32 dst_mem_idx, uint32 len, uint32 src_offset, diff --git a/core/iwasm/fast-jit/fe/jit_emit_memory.h b/core/iwasm/fast-jit/fe/jit_emit_memory.h index 6565cdc11b..2fdacccf52 100644 --- a/core/iwasm/fast-jit/fe/jit_emit_memory.h +++ b/core/iwasm/fast-jit/fe/jit_emit_memory.h @@ -55,7 +55,9 @@ jit_compile_op_memory_init(JitCompContext *cc, uint32 mem_idx, uint32 seg_idx); bool jit_compile_op_data_drop(JitCompContext *cc, uint32 seg_idx); +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 bool jit_compile_op_memory_copy(JitCompContext *cc, uint32 src_mem_idx, uint32 dst_mem_idx); diff --git a/core/iwasm/fast-jit/fe/jit_emit_numberic.c b/core/iwasm/fast-jit/fe/jit_emit_numberic.c index 00f608f84d..347c21827e 100644 --- a/core/iwasm/fast-jit/fe/jit_emit_numberic.c +++ b/core/iwasm/fast-jit/fe/jit_emit_numberic.c @@ -1564,7 +1564,7 @@ static float64 f64_min(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -1575,7 +1575,7 @@ static float64 f64_max(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else diff --git a/core/iwasm/fast-jit/jit_dump.c b/core/iwasm/fast-jit/jit_dump.c index d61ed5dc78..7e45dd83df 100644 --- a/core/iwasm/fast-jit/jit_dump.c +++ b/core/iwasm/fast-jit/jit_dump.c @@ -40,7 +40,7 @@ jit_dump_reg(JitCompContext *cc, JitReg reg) case JIT_REG_KIND_F32: if (jit_reg_is_const(reg)) - os_printf("%f", jit_cc_get_const_F32(cc, reg)); + os_printf("%f", (double)jit_cc_get_const_F32(cc, reg)); else os_printf("f%d", no); break; diff --git a/core/iwasm/fast-jit/jit_frontend.c b/core/iwasm/fast-jit/jit_frontend.c index 566783b6f6..c96b5410ba 100644 --- a/core/iwasm/fast-jit/jit_frontend.c +++ b/core/iwasm/fast-jit/jit_frontend.c @@ -1627,7 +1627,7 @@ jit_compile_func(JitCompContext *cc) read_leb_uint32(frame_ip, frame_ip_end, type_idx); -#if WASM_ENABLE_REF_TYPES != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); #else frame_ip++; @@ -2336,6 +2336,8 @@ jit_compile_func(JitCompContext *cc) return false; break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { uint32 src_mem_idx, dst_mem_idx; @@ -2353,7 +2355,7 @@ jit_compile_func(JitCompContext *cc) return false; break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: { diff --git a/core/iwasm/include/aot_comp_option.h b/core/iwasm/include/aot_comp_option.h index 069ceab319..9a9023ee2e 100644 --- a/core/iwasm/include/aot_comp_option.h +++ b/core/iwasm/include/aot_comp_option.h @@ -62,13 +62,16 @@ typedef struct AOTCompOption { char *cpu_features; bool is_sgx_platform; bool enable_bulk_memory; + bool enable_bulk_memory_opt; bool enable_thread_mgr; bool enable_tail_call; bool enable_simd; bool enable_ref_types; + bool enable_call_indirect_overlong; bool enable_gc; bool enable_aux_stack_check; bool enable_extended_const; + bool enable_lime1; AOTStackFrameType aux_stack_frame_type; AOTCallStackFeatures call_stack_features; bool enable_perf_profiling; diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h index 81efb8f6f7..fc46825c80 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -1526,6 +1526,14 @@ wasm_runtime_get_native_addr_range(wasm_module_inst_t module_inst, /** * Get the number of import items for a WASM module * + * Typical usage scenario: + * Combine this function with wasm_runtime_get_import_count() to traverse + * all import items in a module. Use import_type.kind to filter and identify + * different types of import items. + * + * Example usage (as wasm_runtime_for_each_import_func() in + * samples/import-func-callback) + * * @param module the WASM module * * @return the number of imports (zero for none), or -1 for failure @@ -1536,6 +1544,14 @@ wasm_runtime_get_import_count(const wasm_module_t module); /** * Get information about a specific WASM module import * + * Typical usage scenario: + * Combine this function with wasm_runtime_get_import_count() to traverse + * all import items in a module. Use import_type.kind to filter and identify + * different types of import items. + * + * Example usage (as wasm_runtime_for_each_import_func() in + * samples/import-func-callback) + * * @param module the WASM module * @param import_index the desired import index * @param import_type the location to store information about the import @@ -1724,11 +1740,15 @@ wasm_table_type_get_max_size(const wasm_table_type_t table_type); * auto check its boundary before calling the native function. * If it is followed by '~', the checked length of the pointer * is gotten from the following parameter, if not, the checked - * length of the pointer is 1. + * length of the pointer is 1. The runtime will also convert + * the app pointer to a native pointer, thus there is no need + * to manually call `wasm_runtime_addr_app_to_native`. * '~': the parameter is the pointer's length with i32 type, and must * follow after '*' * '$': the parameter is a string (i32 in WASM), and runtime will - * auto check its boundary before calling the native function + * auto check its boundary before calling the native function. + * Like '*', the runtime will also convert the app pointer to a + * native pointer. * @param n_native_symbols specifies the number of native symbols in the array * * @return true if success, false otherwise diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h index 0dd73958eb..87552455e6 100644 --- a/core/iwasm/interpreter/wasm.h +++ b/core/iwasm/interpreter/wasm.h @@ -751,6 +751,10 @@ struct WASMFunction { void *call_to_fast_jit_from_llvm_jit; #endif #endif + +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint8 *code_body_begin; +#endif }; #if WASM_ENABLE_TAGS != 0 @@ -761,6 +765,23 @@ struct WASMTag { }; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 +enum WASMCompilationHintType { + DUMMY = 0, + WASM_COMPILATION_BRANCH_HINT = 0, +}; +struct WASMCompilationHint { + struct WASMCompilationHint *next; + enum WASMCompilationHintType type; +}; +struct WASMCompilationHintBranchHint { + struct WASMCompilationHint *next; + enum WASMCompilationHintType type; + uint32 offset; + bool is_likely; +}; +#endif + struct WASMGlobal { WASMGlobalType type; #if WASM_ENABLE_GC != 0 @@ -1049,6 +1070,10 @@ struct WASMModule { const uint8 *name_section_buf_end; #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + struct WASMCompilationHint **function_hints; +#endif + #if WASM_ENABLE_LOAD_CUSTOM_SECTION != 0 WASMCustomSection *custom_section_list; #endif diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index edc473f2c2..0603a00b41 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -223,7 +223,7 @@ static inline float64 f64_min(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -234,7 +234,7 @@ static inline float64 f64_max(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else @@ -1567,7 +1567,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, WASMMemoryInstance *memory = wasm_get_default_memory(module); #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 uint64 linear_mem_size = 0; if (memory) #if WASM_ENABLE_THREAD_MGR == 0 @@ -1685,7 +1685,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, goto got_exception; } - HANDLE_OP(WASM_OP_NOP) { HANDLE_OP_END(); } + HANDLE_OP(WASM_OP_NOP) + { + HANDLE_OP_END(); + } #if WASM_ENABLE_EXCE_HANDLING != 0 HANDLE_OP(WASM_OP_RETHROW) @@ -2367,7 +2370,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, cur_type = wasm_types[tidx]; /* clang-format off */ -#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 || WASM_ENABLE_GC != 0 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); #else frame_ip++; @@ -3162,7 +3165,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, if (len > 0) { if ((uint64)start_offset + len - >= wasm_array_obj_length(array_obj)) { + > wasm_array_obj_length(array_obj)) { wasm_set_exception( module, "out of bounds array access"); goto got_exception; @@ -5622,7 +5625,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, HANDLE_OP(WASM_OP_I32_REINTERPRET_F32) HANDLE_OP(WASM_OP_I64_REINTERPRET_F64) HANDLE_OP(WASM_OP_F32_REINTERPRET_I32) - HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) { HANDLE_OP_END(); } + HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) + { + HANDLE_OP_END(); + } HANDLE_OP(WASM_OP_I32_EXTEND8_S) { @@ -5697,7 +5703,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, true); break; case WASM_OP_I64_TRUNC_SAT_U_F64: - DEF_OP_TRUNC_SAT_F64(-1.0f, 18446744073709551616.0, + DEF_OP_TRUNC_SAT_F64(-1.0, 18446744073709551616.0, false, false); break; #if WASM_ENABLE_BULK_MEMORY != 0 @@ -5768,6 +5774,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, segment); break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { mem_offset_t dst, src, len; @@ -5888,7 +5896,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, memset(mdst, fill_val, len); break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { @@ -6873,7 +6881,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 out_of_bounds: wasm_set_exception(module, "out of bounds memory access"); #endif diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c index 36d4538ffc..8e634ecb7f 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -164,7 +164,7 @@ static inline float64 f64_min(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? a : b; else @@ -175,7 +175,7 @@ static inline float64 f64_max(float64 a, float64 b) { if (isnan(a) || isnan(b)) - return NAN; + return (float64)NAN; else if (a == 0 && a == b) return signbit(a) ? b : a; else @@ -1501,7 +1501,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, WASMMemoryInstance *memory = wasm_get_default_memory(module); #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 uint64 linear_mem_size = 0; if (memory) #if WASM_ENABLE_THREAD_MGR == 0 @@ -2562,7 +2562,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, if (len > 0) { if ((uint64)start_offset + len - >= wasm_array_obj_length(array_obj)) { + > wasm_array_obj_length(array_obj)) { wasm_set_exception( module, "out of bounds array access"); goto got_exception; @@ -5057,6 +5057,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, PUT_I64_TO_ADDR((uint32 *)(frame_lp + local_offset), GET_I64_FROM_ADDR(frame_lp + addr1)); } + else if (local_type == VALUE_TYPE_V128) { + PUT_V128_TO_ADDR((frame_lp + local_offset), + GET_V128_FROM_ADDR(frame_lp + addr1)); + } #if WASM_ENABLE_GC != 0 else if (wasm_is_type_reftype(local_type)) { PUT_REF_TO_ADDR((uint32 *)(frame_lp + local_offset), @@ -5200,6 +5204,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, segment); break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { uint32 dst, src, len; @@ -5290,7 +5296,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, memset(mdst, fill_val, len); break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { @@ -7805,7 +7811,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ - || WASM_ENABLE_BULK_MEMORY != 0 + || WASM_ENABLE_BULK_MEMORY_OPT != 0 out_of_bounds: wasm_set_exception(module, "out of bounds memory access"); #endif diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index 3f8c68db64..1453f1bfae 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -400,8 +400,7 @@ check_array_type(const WASMModule *module, uint32 type_index, char *error_buf, error_buf_size)) { return false; } - if (module->types[type_index] == NULL - || module->types[type_index]->type_flag != WASM_TYPE_ARRAY) { + if (module->types[type_index]->type_flag != WASM_TYPE_ARRAY) { set_error_buf(error_buf, error_buf_size, "unknown array type"); return false; } @@ -424,8 +423,7 @@ check_function_type(const WASMModule *module, uint32 type_index, } #if WASM_ENABLE_GC != 0 - if (module->types[type_index] == NULL - || module->types[type_index]->type_flag != WASM_TYPE_FUNC) { + if (module->types[type_index]->type_flag != WASM_TYPE_FUNC) { set_error_buf(error_buf, error_buf_size, "unknown function type"); return false; } @@ -1257,9 +1255,8 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_STRUCT) { + if (module->types[type_idx]->type_flag + != WASM_TYPE_STRUCT) { set_error_buf(error_buf, error_buf_size, "unknown struct type"); goto fail; @@ -1802,6 +1799,11 @@ resolve_func_type(const uint8 **p_buf, const uint8 *buf_end, WASMModule *module, return false; } if (ref_type_map_count > 0) { + if (ref_type_map_count > UINT16_MAX) { + set_error_buf(error_buf, error_buf_size, + "ref type count too large"); + return false; + } total_size = sizeof(WASMRefTypeMap) * (uint64)ref_type_map_count; if (!(type->ref_type_maps = loader_malloc(total_size, error_buf, error_buf_size))) { @@ -1941,6 +1943,11 @@ resolve_struct_type(const uint8 **p_buf, const uint8 *buf_end, return false; } if (ref_type_map_count > 0) { + if (ref_type_map_count > UINT16_MAX) { + set_error_buf(error_buf, error_buf_size, + "ref type count too large"); + return false; + } total_size = sizeof(WASMRefTypeMap) * (uint64)ref_type_map_count; if (!(type->ref_type_maps = loader_malloc(total_size, error_buf, error_buf_size))) { @@ -1964,6 +1971,10 @@ resolve_struct_type(const uint8 **p_buf, const uint8 *buf_end, error_buf_size)) { goto fail; } + if (!is_valid_field_type(ref_type.ref_type)) { + set_error_buf(error_buf, error_buf_size, "invalid field type"); + goto fail; + } type->fields[i].field_type = ref_type.ref_type; if (need_ref_type_map) { type->ref_type_maps[j].index = i; @@ -2499,6 +2510,13 @@ load_type_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, #endif /* end of WASM_ENABLE_GC == 0 */ } + for (i = 0; i < module->type_count; i++) { + if (module->types[i] == NULL) { + set_error_buf_v(error_buf, error_buf_size, "unknown type %d", i); + return false; + } + } + if (p != p_end) { set_error_buf(error_buf, error_buf_size, "section size mismatch"); return false; @@ -3890,6 +3908,9 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, /* Resolve local set count */ p_code_end = p_code + code_size; +#if WASM_ENABLE_BRANCH_HINTS != 0 + uint8 *p_body_start = (uint8 *)p_code; +#endif local_count = 0; read_leb_uint32(p_code, buf_code_end, local_set_count); p_code_save = p_code; @@ -3949,6 +3970,11 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, } #if WASM_ENABLE_GC != 0 if (ref_type_map_count > 0) { + if (ref_type_map_count > UINT16_MAX) { + set_error_buf(error_buf, error_buf_size, + "ref type count too large"); + return false; + } total_size = sizeof(WASMRefTypeMap) * (uint64)ref_type_map_count; if (!(func->local_ref_type_maps = loader_malloc( @@ -3965,6 +3991,9 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, if (local_count > 0) func->local_types = (uint8 *)func + sizeof(WASMFunction); func->code_size = code_size; +#if WASM_ENABLE_BRANCH_HINTS != 0 + func->code_body_begin = p_body_start; +#endif /* * we shall make a copy of code body [p_code, p_code + code_size] * when we are worrying about inappropriate releasing behaviour. @@ -5537,6 +5566,88 @@ handle_name_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, } #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 +static bool +handle_branch_hint_section(const uint8 *buf, const uint8 *buf_end, + WASMModule *module, char *error_buf, + uint32 error_buf_size) +{ + if (module->function_hints == NULL) { + module->function_hints = loader_malloc( + sizeof(struct WASMCompilationHint) * module->function_count, + error_buf, error_buf_size); + } + uint32 numFunctionHints = 0; + read_leb_uint32(buf, buf_end, numFunctionHints); + for (uint32 i = 0; i < numFunctionHints; ++i) { + uint32 func_idx; + read_leb_uint32(buf, buf_end, func_idx); + if (!check_function_index(module, func_idx, error_buf, + error_buf_size)) { + goto fail; + } + if (func_idx < module->import_function_count) { + set_error_buf(error_buf, error_buf_size, + "branch hint for imported function is not allowed"); + goto fail; + } + + struct WASMCompilationHint *current_hint = + (struct WASMCompilationHint *)&module + ->function_hints[func_idx - module->import_function_count]; + while (current_hint->next != NULL) { + current_hint = current_hint->next; + } + + uint32 num_hints; + read_leb_uint32(buf, buf_end, num_hints); + struct WASMCompilationHintBranchHint *new_hints = loader_malloc( + sizeof(struct WASMCompilationHintBranchHint) * num_hints, error_buf, + error_buf_size); + for (uint32 j = 0; j < num_hints; ++j) { + struct WASMCompilationHintBranchHint *new_hint = &new_hints[j]; + new_hint->next = NULL; + new_hint->type = WASM_COMPILATION_BRANCH_HINT; + read_leb_uint32(buf, buf_end, new_hint->offset); + + uint32 size; + read_leb_uint32(buf, buf_end, size); + if (size != 1) { + set_error_buf_v(error_buf, error_buf_size, + "invalid branch hint size, expected 1, got %d.", + size); + wasm_runtime_free(new_hint); + goto fail; + } + + uint8 data = *buf++; + if (data == 0x00) + new_hint->is_likely = false; + else if (data == 0x01) + new_hint->is_likely = true; + else { + set_error_buf_v(error_buf, error_buf_size, + "invalid branch hint, expected 0 or 1, got %d", + data); + wasm_runtime_free(new_hint); + goto fail; + } + + current_hint->next = (struct WASMCompilationHint *)new_hint; + current_hint = (struct WASMCompilationHint *)new_hint; + } + } + if (buf != buf_end) { + set_error_buf(error_buf, error_buf_size, + "invalid branch hint section, not filled until end"); + goto fail; + } + return true; +fail: + return false; +} +#endif + static bool load_user_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, bool is_load_from_file_buf, char *error_buf, @@ -5586,6 +5697,24 @@ load_user_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, } #endif +#if WASM_ENABLE_BRANCH_HINTS != 0 + if (name_len == 25 + && memcmp((const char *)p, "metadata.code.branch_hint", 25) == 0) { + p += name_len; + if (!handle_branch_hint_section(p, p_end, module, error_buf, + error_buf_size)) { + return false; + } + LOG_VERBOSE("Load branch hint section success."); + } +#else + if (name_len == 25 + && memcmp((const char *)p, "metadata.code.branch_hint", 25) == 0) { + LOG_VERBOSE("Found branch hint section, but branch hints are disabled " + "in this build, skipping."); + } +#endif + #if WASM_ENABLE_LOAD_CUSTOM_SECTION != 0 { WASMCustomSection *section = @@ -5740,6 +5869,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, #if WASM_ENABLE_BULK_MEMORY != 0 option.enable_bulk_memory = true; #endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 + option.enable_bulk_memory_opt = true; +#endif #if WASM_ENABLE_THREAD_MGR != 0 option.enable_thread_mgr = true; #endif @@ -5753,6 +5885,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, option.enable_ref_types = true; #elif WASM_ENABLE_GC != 0 option.enable_gc = true; +#endif +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 + option.enable_call_indirect_overlong = true; #endif option.enable_aux_stack_check = true; #if WASM_ENABLE_PERF_PROFILING != 0 || WASM_ENABLE_DUMP_CALL_STACK != 0 \ @@ -6689,15 +6824,7 @@ create_module(char *name, char *error_buf, uint32 error_buf_size) #endif #if WASM_ENABLE_LIBC_WASI != 0 -#if WASM_ENABLE_UVWASI == 0 - module->wasi_args.stdio[0] = os_invalid_raw_handle(); - module->wasi_args.stdio[1] = os_invalid_raw_handle(); - module->wasi_args.stdio[2] = os_invalid_raw_handle(); -#else - module->wasi_args.stdio[0] = os_get_invalid_handle(); - module->wasi_args.stdio[1] = os_get_invalid_handle(); - module->wasi_args.stdio[2] = os_get_invalid_handle(); -#endif /* WASM_ENABLE_UVWASI == 0 */ + wasi_args_set_defaults(&module->wasi_args); #endif /* WASM_ENABLE_LIBC_WASI != 0 */ (void)ret; @@ -7373,7 +7500,17 @@ wasm_loader_unload(WASMModule *module) } #endif #endif - +#if WASM_ENABLE_BRANCH_HINTS != 0 + for (i = 0; i < module->function_count; i++) { + // be carefull when adding more hints. This only works as long as + // the hint structs have been allocated all at once as an array. + // With only branch-hints at the moment, this is the case. + if (module->function_hints != NULL && module->function_hints[i] != NULL) + wasm_runtime_free(module->function_hints[i]); + } + if (module->function_hints != NULL) + wasm_runtime_free(module->function_hints); +#endif wasm_runtime_free(module); } @@ -7608,7 +7745,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_RETURN_CALL_INDIRECT: #endif skip_leb_uint32(p, p_end); /* typeidx */ -#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 || WASM_ENABLE_GC != 0 skip_leb_uint32(p, p_end); /* tableidx */ #else u8 = read_uint8(p); /* 0x00 */ @@ -8033,6 +8170,8 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_DATA_DROP: skip_leb_uint32(p, p_end); break; +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: skip_leb_memidx(p, p_end); skip_leb_memidx(p, p_end); @@ -8040,7 +8179,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_MEMORY_FILL: skip_leb_memidx(p, p_end); break; -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: case WASM_OP_TABLE_COPY: @@ -8403,6 +8542,15 @@ check_offset_pop(WASMLoaderContext *ctx, uint32 cells) return true; } +static bool +check_dynamic_offset_pop(WASMLoaderContext *ctx, uint32 cells) +{ + if (ctx->dynamic_offset < 0 + || (ctx->dynamic_offset > 0 && (uint32)ctx->dynamic_offset < cells)) + return false; + return true; +} + static void free_label_patch_list(BranchBlock *frame_csp) { @@ -9841,7 +9989,8 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type, return true; ctx->frame_offset -= cell_num_to_pop; - if ((*(ctx->frame_offset) > ctx->start_dynamic_offset) + if (check_dynamic_offset_pop(ctx, cell_num_to_pop) + && (*(ctx->frame_offset) > ctx->start_dynamic_offset) && (*(ctx->frame_offset) < ctx->max_dynamic_offset)) ctx->dynamic_offset -= cell_num_to_pop; @@ -11911,9 +12060,25 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, WASMFuncType *wasm_type = block_type.u.type; BranchBlock *cur_block = loader_ctx->frame_csp - 1; +#if WASM_ENABLE_GC != 0 + WASMRefType *ref_type; + uint32 j = 0; +#endif #if WASM_ENABLE_FAST_INTERP != 0 uint32 cell_num; available_params = block_type.u.type->param_count; +#endif +#if WASM_ENABLE_GC != 0 + /* find the index of the last param + * in wasm_type->ref_type_maps as j */ + for (i = 0; i < block_type.u.type->param_count; i++) { + if (wasm_is_type_multi_byte_type(wasm_type->types[i])) { + j += 1; + } + } + if (j > 0) { + j -= 1; + } #endif for (i = 0; i < block_type.u.type->param_count; i++) { @@ -11927,6 +12092,19 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } +#if WASM_ENABLE_GC != 0 + if (wasm_is_type_multi_byte_type( + wasm_type + ->types[wasm_type->param_count - i - 1])) { + bh_assert(wasm_type->ref_type_maps[j].index + == wasm_type->param_count - i - 1); + ref_type = wasm_type->ref_type_maps[j].ref_type; + bh_memcpy_s(&wasm_ref_type, sizeof(WASMRefType), + ref_type, + wasm_reftype_struct_size(ref_type)); + j--; + } +#endif POP_TYPE( wasm_type->types[wasm_type->param_count - i - 1]); @@ -12685,9 +12863,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf, error_buf_size)) { goto fail; } - if (module->types[type_idx1] == NULL - || module->types[type_idx1]->type_flag - != WASM_TYPE_FUNC) { + if (module->types[type_idx1]->type_flag != WASM_TYPE_FUNC) { set_error_buf(error_buf, error_buf_size, "unknown function type"); goto fail; @@ -12704,9 +12880,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_FUNC) { + if (module->types[type_idx]->type_flag != WASM_TYPE_FUNC) { set_error_buf(error_buf, error_buf_size, "unknown function type"); goto fail; @@ -12860,7 +13034,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif pb_read_leb_uint32(p, p_end, type_idx); -#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 || WASM_ENABLE_GC != 0 #if WASM_ENABLE_WAMR_COMPILER != 0 if (p + 1 < p_end && *p != 0x00) { /* @@ -14542,9 +14716,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_STRUCT) { + if (module->types[type_idx]->type_flag + != WASM_TYPE_STRUCT) { set_error_buf(error_buf, error_buf_size, "unknown struct type"); goto fail; @@ -14630,9 +14803,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, error_buf_size)) { goto fail; } - if (module->types[type_idx] == NULL - || module->types[type_idx]->type_flag - != WASM_TYPE_STRUCT) { + if (module->types[type_idx]->type_flag + != WASM_TYPE_STRUCT) { set_error_buf(error_buf, error_buf_size, "unknown struct type"); goto fail; @@ -15548,8 +15720,11 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, emit_uint32(loader_ctx, data_seg_idx); #endif if (module->import_memory_count == 0 - && module->memory_count == 0) - goto fail_unknown_memory; + && module->memory_count == 0) { + set_error_buf(error_buf, error_buf_size, + "unknown memory 0"); + goto fail; + } pb_read_leb_uint32(p, p_end, memidx); check_memidx(module, memidx); @@ -15598,6 +15773,12 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } + fail_data_cnt_sec_require: + set_error_buf(error_buf, error_buf_size, + "data count section required"); + goto fail; +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { CHECK_BUF(p, p_end, sizeof(int16)); @@ -15608,8 +15789,11 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, check_memidx(module, memidx); if (module->import_memory_count == 0 - && module->memory_count == 0) - goto fail_unknown_memory; + && module->memory_count == 0) { + set_error_buf(error_buf, error_buf_size, + "unknown memory 0"); + goto fail; + } POP_MEM_OFFSET(); POP_MEM_OFFSET(); @@ -15628,7 +15812,9 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, check_memidx(module, memidx); if (module->import_memory_count == 0 && module->memory_count == 0) { - goto fail_unknown_memory; + set_error_buf(error_buf, error_buf_size, + "unknown memory 0"); + goto fail; } POP_MEM_OFFSET(); POP_I32(); @@ -15641,16 +15827,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } - - fail_unknown_memory: - set_error_buf(error_buf, error_buf_size, - "unknown memory 0"); - goto fail; - fail_data_cnt_sec_require: - set_error_buf(error_buf, error_buf_size, - "data count section required"); - goto fail; -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 case WASM_OP_TABLE_INIT: { diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c index 771538a142..ec1e25cdb1 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c @@ -2388,6 +2388,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, #if WASM_ENABLE_BULK_MEMORY != 0 option.enable_bulk_memory = true; #endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 + option.enable_bulk_memory_opt = true; +#endif #if WASM_ENABLE_THREAD_MGR != 0 option.enable_thread_mgr = true; #endif @@ -2399,6 +2402,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, #endif #if WASM_ENABLE_REF_TYPES != 0 option.enable_ref_types = true; +#endif +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 + option.enable_call_indirect_overlong = true; #endif option.enable_aux_stack_check = true; #if WASM_ENABLE_PERF_PROFILING != 0 || WASM_ENABLE_DUMP_CALL_STACK != 0 \ @@ -3316,15 +3322,7 @@ create_module(char *name, char *error_buf, uint32 error_buf_size) #endif #if WASM_ENABLE_LIBC_WASI != 0 -#if WASM_ENABLE_LIBC_UVWASI == 0 - module->wasi_args.stdio[0] = os_invalid_raw_handle(); - module->wasi_args.stdio[1] = os_invalid_raw_handle(); - module->wasi_args.stdio[2] = os_invalid_raw_handle(); -#else - module->wasi_args.stdio[0] = os_get_invalid_handle(); - module->wasi_args.stdio[1] = os_get_invalid_handle(); - module->wasi_args.stdio[2] = os_get_invalid_handle(); -#endif /* WASM_ENABLE_UVWASI == 0 */ + wasi_args_set_defaults(&module->wasi_args); #endif /* WASM_ENABLE_LIBC_WASI != 0 */ (void)ret; @@ -3857,7 +3855,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_RETURN_CALL_INDIRECT: #endif skip_leb_uint32(p, p_end); /* typeidx */ -#if WASM_ENABLE_REF_TYPES != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 skip_leb_uint32(p, p_end); /* tableidx */ #else u8 = read_uint8(p); /* 0x00 */ @@ -4119,6 +4117,8 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_DATA_DROP: skip_leb_uint32(p, p_end); break; +#endif +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: skip_leb_memidx(p, p_end); skip_leb_memidx(p, p_end); @@ -4126,7 +4126,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, case WASM_OP_MEMORY_FILL: skip_leb_memidx(p, p_end); break; -#endif +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: case WASM_OP_TABLE_COPY: @@ -4342,6 +4342,15 @@ check_offset_pop(WASMLoaderContext *ctx, uint32 cells) return true; } +static bool +check_dynamic_offset_pop(WASMLoaderContext *ctx, uint32 cells) +{ + if (ctx->dynamic_offset < 0 + || (ctx->dynamic_offset > 0 && (uint32)ctx->dynamic_offset < cells)) + return false; + return true; +} + static void free_label_patch_list(BranchBlock *frame_csp) { @@ -5256,7 +5265,8 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type, return true; ctx->frame_offset -= cell_num_to_pop; - if ((*(ctx->frame_offset) > ctx->start_dynamic_offset) + if (check_dynamic_offset_pop(ctx, cell_num_to_pop) + && (*(ctx->frame_offset) > ctx->start_dynamic_offset) && (*(ctx->frame_offset) < ctx->max_dynamic_offset)) ctx->dynamic_offset -= cell_num_to_pop; @@ -7077,7 +7087,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, pb_read_leb_uint32(p, p_end, type_idx); -#if WASM_ENABLE_REF_TYPES != 0 +#if WASM_ENABLE_CALL_INDIRECT_OVERLONG != 0 pb_read_leb_uint32(p, p_end, table_idx); #else CHECK_BUF(p, p_end, 1); @@ -8282,6 +8292,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } +#endif /* WASM_ENABLE_BULK_MEMORY */ +#if WASM_ENABLE_BULK_MEMORY_OPT != 0 case WASM_OP_MEMORY_COPY: { CHECK_MEMORY(); @@ -8314,7 +8326,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, #endif break; } -#endif /* WASM_ENABLE_BULK_MEMORY */ +#endif /* WASM_ENABLE_BULK_MEMORY_OPT */ #if WASM_ENABLE_REF_TYPES != 0 case WASM_OP_TABLE_INIT: { diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c index b4aa483d71..e81bbf6e01 100644 --- a/core/iwasm/interpreter/wasm_runtime.c +++ b/core/iwasm/interpreter/wasm_runtime.c @@ -335,14 +335,14 @@ memory_instantiate(WASMModuleInstance *module_inst, WASMModuleInstance *parent, /* If only one page and at most one page, we just append the app heap to the end of linear memory, enlarge the num_bytes_per_page, and don't change the page count */ - heap_offset = num_bytes_per_page; - num_bytes_per_page += heap_size; - if (num_bytes_per_page < heap_size) { + if (heap_size > UINT32_MAX - num_bytes_per_page) { set_error_buf(error_buf, error_buf_size, "failed to insert app heap into linear memory, " "try using `--heap-size=0` option"); return NULL; } + heap_offset = num_bytes_per_page; + num_bytes_per_page += heap_size; } else if (heap_size > 0) { if (init_page_count == max_page_count && init_page_count == 0) { @@ -2421,8 +2421,8 @@ wasm_set_running_mode(WASMModuleInstance *module_inst, RunningMode running_mode) */ WASMModuleInstance * wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, char *error_buf, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size) { WASMModuleInstance *module_inst; @@ -2440,6 +2440,9 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, bool ret = false; #endif const bool is_sub_inst = parent != NULL; + uint32 stack_size = args->v1.default_stack_size; + uint32 heap_size = args->v1.host_managed_heap_size; + uint32 max_memory_pages = args->v1.max_memory_pages; if (!module) return NULL; @@ -2515,7 +2518,7 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, &module_inst->e->sub_module_inst_list_head; ret = wasm_runtime_sub_module_instantiate( (WASMModuleCommon *)module, (WASMModuleInstanceCommon *)module_inst, - stack_size, heap_size, max_memory_pages, error_buf, error_buf_size); + args, error_buf, error_buf_size); if (!ret) { LOG_DEBUG("build a sub module list failed"); goto fail; @@ -3744,16 +3747,16 @@ wasm_dump_perf_profiling(const WASMModuleInstance *module_inst) os_printf( " func %s, execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - func_name, func_inst->total_exec_time / 1000.0f, + func_name, func_inst->total_exec_time / 1000.0, func_inst->total_exec_cnt, - func_inst->children_exec_time / 1000.0f); + func_inst->children_exec_time / 1000.0); else os_printf(" func %" PRIu32 ", execution time: %.3f ms, execution count: %" PRIu32 " times, children execution time: %.3f ms\n", - i, func_inst->total_exec_time / 1000.0f, + i, func_inst->total_exec_time / 1000.0, func_inst->total_exec_cnt, - func_inst->children_exec_time / 1000.0f); + func_inst->children_exec_time / 1000.0); } } @@ -3765,7 +3768,7 @@ wasm_summarize_wasm_execute_time(const WASMModuleInstance *inst) unsigned i; for (i = 0; i < inst->e->function_count; i++) { WASMFunctionInstance *func = inst->e->functions + i; - ret += (func->total_exec_time - func->children_exec_time) / 1000.0f; + ret += (func->total_exec_time - func->children_exec_time) / 1000.0; } return ret; @@ -3780,7 +3783,7 @@ wasm_get_wasm_func_exec_time(const WASMModuleInstance *inst, char *name_in_wasm = get_func_name_from_index(inst, i); if (name_in_wasm && strcmp(name_in_wasm, func_name) == 0) { WASMFunctionInstance *func = inst->e->functions + i; - return (func->total_exec_time - func->children_exec_time) / 1000.0f; + return (func->total_exec_time - func->children_exec_time) / 1000.0; } } diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h index 16c670f0fa..0ba2049af9 100644 --- a/core/iwasm/interpreter/wasm_runtime.h +++ b/core/iwasm/interpreter/wasm_runtime.h @@ -553,8 +553,8 @@ wasm_resolve_import_func(const WASMModule *module, WASMModuleInstance * wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, - WASMExecEnv *exec_env_main, uint32 stack_size, - uint32 heap_size, uint32 max_memory_pages, char *error_buf, + WASMExecEnv *exec_env_main, + const struct InstantiationArgs2 *args, char *error_buf, uint32 error_buf_size); void diff --git a/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c b/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c index b3fa57d721..d7dca2f1df 100644 --- a/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c +++ b/core/iwasm/libraries/lib-pthread/lib_pthread_wrapper.c @@ -561,6 +561,7 @@ pthread_create_wrapper(wasm_exec_env_t exec_env, uint32 aux_stack_size; uint64 aux_stack_start = 0; int32 ret = -1; + struct InstantiationArgs2 args; bh_assert(module); bh_assert(module_inst); @@ -579,8 +580,10 @@ pthread_create_wrapper(wasm_exec_env_t exec_env, } #endif + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); if (!(new_module_inst = wasm_runtime_instantiate_internal( - module, module_inst, exec_env, stack_size, 0, 0, NULL, 0))) + module, module_inst, exec_env, &args, NULL, 0))) return -1; /* Set custom_data to new module instance */ diff --git a/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h b/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h index 98ccc78c11..2bad1ebed9 100644 --- a/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h +++ b/core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h @@ -219,6 +219,9 @@ getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, void freeaddrinfo(struct addrinfo *res); + +const char * +gai_strerror(int code); #endif /** diff --git a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c index f016bdebca..2a4b4a7214 100644 --- a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c +++ b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c @@ -18,7 +18,7 @@ * * wasi-libc's errno is a TLS variable, exposed directly via * errno.h. if we use it here, LLVM may lower it differently, - * depending on enabled features like atomcs and bulk-memory. + * depending on enabled features like atomics and bulk-memory. * we tweak the way to access errno here in order to make us * compatible with both of threaded and non-threaded applications. * __errno_location() should be reasonably stable because @@ -590,6 +590,28 @@ freeaddrinfo(struct addrinfo *res) free(res); } +const char * +gai_strerror(int code) +{ + switch (code) { +#define ERR(a) \ + case a: \ + return #a + ERR(EAI_AGAIN); + ERR(EAI_BADFLAGS); + ERR(EAI_FAIL); + ERR(EAI_FAMILY); + ERR(EAI_MEMORY); + ERR(EAI_NONAME); + ERR(EAI_OVERFLOW); + ERR(EAI_SERVICE); + ERR(EAI_SOCKTYPE); + ERR(EAI_SYSTEM); +#undef ERR + } + return "Unknown error"; +} + static struct timeval time_us_to_timeval(uint64_t time_us) { diff --git a/core/iwasm/libraries/lib-socket/test/nslookup.c b/core/iwasm/libraries/lib-socket/test/nslookup.c index 8e64d06be3..2e42ef8458 100644 --- a/core/iwasm/libraries/lib-socket/test/nslookup.c +++ b/core/iwasm/libraries/lib-socket/test/nslookup.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -28,6 +29,15 @@ test_nslookup(int af) hints.ai_family = af; hints.ai_socktype = SOCK_STREAM; int ret = getaddrinfo(url, 0, &hints, &res); + if (ret != 0) { + if (ret == EAI_SYSTEM) { + fprintf(stderr, "getaddrinfo failed: %s (%s)\n", gai_strerror(ret), + strerror(errno)); + } + else { + fprintf(stderr, "getaddrinfo failed: %s\n", gai_strerror(ret)); + } + } assert(ret == 0); struct addrinfo *address = res; while (address) { diff --git a/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c b/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c index c9512fb432..65b75ac28e 100644 --- a/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c +++ b/core/iwasm/libraries/lib-wasi-threads/lib_wasi_threads_wrapper.c @@ -80,14 +80,17 @@ thread_spawn_wrapper(wasm_exec_env_t exec_env, uint32 start_arg) int32 thread_id; uint32 stack_size = 8192; int32 ret = -1; + struct InstantiationArgs2 args; bh_assert(module); bh_assert(module_inst); stack_size = ((WASMModuleInstance *)module_inst)->default_wasm_stack_size; + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); if (!(new_module_inst = wasm_runtime_instantiate_internal( - module, module_inst, exec_env, stack_size, 0, 0, NULL, 0))) + module, module_inst, exec_env, &args, NULL, 0))) return -1; wasm_runtime_set_custom_data_internal( diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c index f7dfea0b52..5ab189e71d 100644 --- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c @@ -1016,12 +1016,10 @@ update_clock_subscription_data(wasi_subscription_t *in, uint32 nsubscriptions, } static wasi_errno_t -execute_interruptible_poll_oneoff( -#if !defined(WASMTIME_SSP_STATIC_CURFDS) - struct fd_table *curfds, -#endif - const __wasi_subscription_t *in, __wasi_event_t *out, size_t nsubscriptions, - size_t *nevents, wasm_exec_env_t exec_env) +execute_interruptible_poll_oneoff(struct fd_table *curfds, + const __wasi_subscription_t *in, + __wasi_event_t *out, size_t nsubscriptions, + size_t *nevents, wasm_exec_env_t exec_env) { if (nsubscriptions == 0) { *nevents = 0; @@ -1161,6 +1159,9 @@ wasi_sock_accept(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_fdflags_t flags, if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(fd_new, sizeof(*fd_new))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); return wasi_ssp_sock_accept(exec_env, curfds, fd, flags, fd_new); @@ -1219,6 +1220,19 @@ wasi_sock_addr_resolve(wasm_exec_env_t exec_env, const char *host, if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(hints, sizeof(*hints))) + return __WASI_EINVAL; + + uint64_t addr_info_byte_size = sizeof(*addr_info) * addr_info_size; + if (addr_info_byte_size / addr_info_size != sizeof(*addr_info)) + return __WASI_EINVAL; + + if (!validate_native_addr(addr_info, addr_info_byte_size)) + return __WASI_EINVAL; + + if (!validate_native_addr(max_info_size, sizeof(*max_info_size))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); ns_lookup_list = wasi_ctx_get_ns_lookup_list(wasi_ctx); @@ -1238,6 +1252,9 @@ wasi_sock_bind(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_addr_t *addr) if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(addr, sizeof(*addr))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); addr_pool = wasi_ctx_get_addr_pool(wasi_ctx); @@ -1264,6 +1281,9 @@ wasi_sock_connect(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_addr_t *addr) if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(addr, sizeof(*addr))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); addr_pool = wasi_ctx_get_addr_pool(wasi_ctx); @@ -1643,6 +1663,9 @@ wasi_sock_open(wasm_exec_env_t exec_env, wasi_fd_t poolfd, if (!wasi_ctx) return __WASI_EACCES; + if (!validate_native_addr(sockfd, sizeof(*sockfd))) + return __WASI_EINVAL; + curfds = wasi_ctx_get_curfds(wasi_ctx); return wasi_ssp_sock_open(exec_env, curfds, poolfd, af, socktype, sockfd); @@ -2082,6 +2105,10 @@ wasi_sock_recv_from(wasm_exec_env_t exec_env, wasi_fd_t sock, return __WASI_EINVAL; } + /* note: src_addr is NULL when called by wasi_sock_recv */ + if (src_addr != NULL && !validate_native_addr(src_addr, sizeof(*src_addr))) + return __WASI_EINVAL; + if (!validate_native_addr(ro_data_len, (uint64)sizeof(uint32))) return __WASI_EINVAL; @@ -2118,15 +2145,19 @@ wasi_sock_recv(wasm_exec_env_t exec_env, wasi_fd_t sock, iovec_app_t *ri_data, wasi_roflags_t *ro_flags) { wasm_module_inst_t module_inst = get_module_inst(exec_env); - __wasi_addr_t src_addr; wasi_errno_t error; + if (!validate_native_addr(ro_data_len, sizeof(*ro_data_len))) + return __WASI_EINVAL; + if (!validate_native_addr(ro_flags, (uint64)sizeof(wasi_roflags_t))) return __WASI_EINVAL; + // We call `recvfrom` with NULL source address as `recv` doesn't + // return the source address and this parameter is not used. + *ro_data_len = 0; error = wasi_sock_recv_from(exec_env, sock, ri_data, ri_data_len, ri_flags, - &src_addr, ro_data_len); - *ro_flags = ri_flags; + NULL, ro_data_len); return error; } @@ -2228,6 +2259,9 @@ wasi_sock_send_to(wasm_exec_env_t exec_env, wasi_fd_t sock, return __WASI_EINVAL; } + if (!validate_native_addr((void *)dest_addr, sizeof(*dest_addr))) + return __WASI_EINVAL; + if (!validate_native_addr(so_data_len, (uint64)sizeof(uint32))) return __WASI_EINVAL; diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c index 4dcc4f5b0b..cf3acf3556 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.c @@ -175,14 +175,14 @@ blocking_op_openat(wasm_exec_env_t exec_env, os_file_handle handle, #ifndef BH_PLATFORM_WINDOWS /* REVISIT: apply the os_file_handle style abstraction for pollfd? */ __wasi_errno_t -blocking_op_poll(wasm_exec_env_t exec_env, struct pollfd *pfds, nfds_t nfds, - int timeout_ms, int *retp) +blocking_op_poll(wasm_exec_env_t exec_env, os_poll_file_handle *pfds, + os_nfds_t nfds, int timeout_ms, int *retp) { int ret; if (!wasm_runtime_begin_blocking_op(exec_env)) { return __WASI_EINTR; } - ret = poll(pfds, nfds, timeout_ms); + ret = os_poll(pfds, nfds, timeout_ms); wasm_runtime_end_blocking_op(exec_env); if (ret == -1) { return convert_errno(errno); diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h index a32e5d662e..310d6bd2c8 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/blocking_op.h @@ -57,8 +57,8 @@ blocking_op_openat(wasm_exec_env_t exec_env, os_file_handle handle, #ifndef BH_PLATFORM_WINDOWS __wasi_errno_t -blocking_op_poll(wasm_exec_env_t exec_env, struct pollfd *pfds, nfds_t nfds, - int timeout, int *retp); +blocking_op_poll(wasm_exec_env_t exec_env, os_poll_file_handle *pfds, + os_nfds_t nfds, int timeout, int *retp); #endif #endif /* end of _BLOCKING_OP_H_ */ diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h index 0ad40ecfd3..b273ba3a9f 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/locking.h @@ -196,8 +196,12 @@ static inline bool cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, bool abstime) REQUIRES_EXCLUSIVE(*lock) NO_LOCK_ANALYSIS { +#if defined(BH_PLATFORM_ZEPHYR) + // TODO: Implement this for Zephyr + return false; +#else int ret; - struct timespec ts = { + os_timespec ts = { .tv_sec = (time_t)(timeout / 1000000000), .tv_nsec = (long)(timeout % 1000000000), }; @@ -210,8 +214,8 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, * realtime clock. */ if (cond->clock != CLOCK_REALTIME) { - struct timespec ts_monotonic; - struct timespec ts_realtime; + os_timespec ts_monotonic; + os_timespec ts_realtime; clock_gettime(cond->clock, &ts_monotonic); ts.tv_sec -= ts_monotonic.tv_sec; @@ -229,7 +233,7 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, ++ts.tv_sec; } } -#endif +#endif /* !CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK */ } else { #if CONFIG_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP @@ -241,7 +245,7 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, return ret == ETIMEDOUT; #else /* Convert to absolute timeout. */ - struct timespec ts_now; + os_timespec ts_now; #if CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK clock_gettime(cond->clock, &ts_now); #else @@ -253,13 +257,14 @@ cond_timedwait(struct cond *cond, struct mutex *lock, uint64_t timeout, ts.tv_nsec -= 1000000000; ++ts.tv_sec; } -#endif +#endif /* CONFIG_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP */ } ret = pthread_cond_timedwait(&cond->object, &lock->object, &ts); bh_assert((ret == 0 || ret == ETIMEDOUT) && "pthread_cond_timedwait() failed"); return ret == ETIMEDOUT; +#endif /* BH_PLATFORM_ZEPHYR */ } #endif diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c index bef4c19f3c..3d90811bca 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c @@ -285,7 +285,7 @@ fd_prestats_get_entry(struct fd_prestats *pt, __wasi_fd_t fd, struct fd_prestat **ret) REQUIRES_SHARED(pt->lock) { // Test for file descriptor existence. - if (fd >= pt->size) + if ((size_t)fd >= pt->size) return __WASI_EBADF; struct fd_prestat *prestat = &pt->prestats[fd]; if (prestat->dir == NULL) @@ -301,7 +301,7 @@ static __wasi_errno_t fd_prestats_remove_entry(struct fd_prestats *pt, __wasi_fd_t fd) { // Test for file descriptor existence. - if (fd >= pt->size) + if ((size_t)fd >= pt->size) return __WASI_EBADF; struct fd_prestat *prestat = &pt->prestats[fd]; @@ -356,16 +356,20 @@ fd_table_get_entry(struct fd_table *ft, __wasi_fd_t fd, REQUIRES_SHARED(ft->lock) { // Test for file descriptor existence. - if (fd >= ft->size) + if ((size_t)fd >= ft->size) { return __WASI_EBADF; + } + struct fd_entry *fe = &ft->entries[fd]; - if (fe->object == NULL) + if (fe->object == NULL) { return __WASI_EBADF; + } // Validate rights. if ((~fe->rights_base & rights_base) != 0 - || (~fe->rights_inheriting & rights_inheriting) != 0) + || (~fe->rights_inheriting & rights_inheriting) != 0) { return __WASI_ENOTCAPABLE; + } *ret = fe; return 0; } @@ -426,15 +430,15 @@ fd_table_attach(struct fd_table *ft, __wasi_fd_t fd, struct fd_object *fo, __wasi_rights_t rights_base, __wasi_rights_t rights_inheriting) REQUIRES_EXCLUSIVE(ft->lock) CONSUMES(fo->refcount) { - assert(ft->size > fd && "File descriptor table too small"); + bh_assert(ft->size > fd && "File descriptor table too small"); struct fd_entry *fe = &ft->entries[fd]; - assert(fe->object == NULL - && "Attempted to overwrite an existing descriptor"); + bh_assert(fe->object == NULL + && "Attempted to overwrite an existing descriptor"); fe->object = fo; fe->rights_base = rights_base; fe->rights_inheriting = rights_inheriting; ++ft->used; - assert(ft->size >= ft->used * 2 && "File descriptor too full"); + bh_assert(ft->size >= ft->used * 2 && "File descriptor too full"); } // Detaches a file descriptor from the file descriptor table. @@ -442,12 +446,12 @@ static void fd_table_detach(struct fd_table *ft, __wasi_fd_t fd, struct fd_object **fo) REQUIRES_EXCLUSIVE(ft->lock) PRODUCES((*fo)->refcount) { - assert(ft->size > fd && "File descriptor table too small"); + bh_assert(ft->size > fd && "File descriptor table too small"); struct fd_entry *fe = &ft->entries[fd]; *fo = fe->object; - assert(*fo != NULL && "Attempted to detach nonexistent descriptor"); + bh_assert(*fo != NULL && "Attempted to detach nonexistent descriptor"); fe->object = NULL; - assert(ft->used > 0 && "Reference count mismatch"); + bh_assert(ft->used > 0 && "Reference count mismatch"); --ft->used; } @@ -636,7 +640,7 @@ fd_table_insert_existing(struct fd_table *ft, __wasi_fd_t in, static __wasi_errno_t fd_table_unused(struct fd_table *ft, __wasi_fd_t *out) REQUIRES_SHARED(ft->lock) { - assert(ft->size > ft->used && "File descriptor table has no free slots"); + bh_assert(ft->size > ft->used && "File descriptor table has no free slots"); for (;;) { uintmax_t random_fd = 0; __wasi_errno_t error = random_uniform(ft->size, &random_fd); @@ -1550,7 +1554,8 @@ path_put(struct path_access *pa) UNLOCKS(pa->fd_object->refcount) { if (pa->path_start) wasm_runtime_free(pa->path_start); - if (pa->fd_object->file_handle != pa->fd) + /* Can't use `!=` operator when `os_file_handle` is a struct */ + if (!os_compare_file_handle(pa->fd_object->file_handle, pa->fd)) os_close(pa->fd, false); fd_object_release(NULL, pa->fd_object); } @@ -1891,7 +1896,7 @@ wasmtime_ssp_fd_filestat_get(wasm_exec_env_t exec_env, struct fd_table *curfds, } static void -convert_timestamp(__wasi_timestamp_t in, struct timespec *out) +convert_timestamp(__wasi_timestamp_t in, os_timespec *out) { // Store sub-second remainder. #if defined(__SYSCALL_SLONG_TYPE) @@ -1899,10 +1904,10 @@ convert_timestamp(__wasi_timestamp_t in, struct timespec *out) #else out->tv_nsec = (long)(in % 1000000000); #endif - in /= 1000000000; + __wasi_timestamp_t temp = in / 1000000000; // Clamp to the maximum in case it would overflow our system's time_t. - out->tv_sec = (time_t)in < BH_TIME_T_MAX ? (time_t)in : BH_TIME_T_MAX; + out->tv_sec = (time_t)temp < BH_TIME_T_MAX ? (time_t)temp : BH_TIME_T_MAX; } __wasi_errno_t @@ -2089,7 +2094,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, size_t nsubscriptions, size_t *nevents) NO_LOCK_ANALYSIS { -#ifdef BH_PLATFORM_WINDOWS +#if defined(BH_PLATFORM_WINDOWS) return __WASI_ENOSYS; #else // Sleeping. @@ -2101,7 +2106,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, #if CONFIG_HAS_CLOCK_NANOSLEEP clockid_t clock_id; if (wasi_clockid_to_clockid(in[0].u.u.clock.clock_id, &clock_id)) { - struct timespec ts; + os_timespec ts; convert_timestamp(in[0].u.u.clock.timeout, &ts); int ret = clock_nanosleep( clock_id, @@ -2128,7 +2133,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, else { // Perform relative sleeps on the monotonic clock also using // nanosleep(). This is incorrect, but good enough for now. - struct timespec ts; + os_timespec ts; convert_timestamp(in[0].u.u.clock.timeout, &ts); nanosleep(&ts, NULL); } @@ -2156,7 +2161,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, } else { // Relative sleeps can be done using nanosleep(). - struct timespec ts; + os_timespec ts; convert_timestamp(in[0].u.u.clock.timeout, &ts); nanosleep(&ts, NULL); } @@ -2181,7 +2186,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, wasm_runtime_malloc((uint32)(nsubscriptions * sizeof(*fos))); if (fos == NULL) return __WASI_ENOMEM; - struct pollfd *pfds = + os_poll_file_handle *pfds = wasm_runtime_malloc((uint32)(nsubscriptions * sizeof(*pfds))); if (pfds == NULL) { wasm_runtime_free(fos); @@ -2205,9 +2210,16 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, fd_object_get_locked(&fos[i], ft, s->u.u.fd_readwrite.fd, __WASI_RIGHT_POLL_FD_READWRITE, 0); if (error == 0) { + +// Temporary workaround (see PR#4377) +#ifdef BH_PLATFORM_ZEPHYR + os_file_handle tfd = fos[i]->file_handle->fd; +#else + os_file_handle tfd = fos[i]->file_handle; +#endif // Proper file descriptor on which we can poll(). - pfds[i] = (struct pollfd){ - .fd = fos[i]->file_handle, + pfds[i] = (os_poll_file_handle){ + .fd = tfd, .events = s->u.type == __WASI_EVENTTYPE_FD_READ ? POLLIN : POLLOUT, @@ -2216,7 +2228,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, else { // Invalid file descriptor or rights missing. fos[i] = NULL; - pfds[i] = (struct pollfd){ .fd = -1 }; + pfds[i] = (os_poll_file_handle){ .fd = -1 }; out[(*nevents)++] = (__wasi_event_t){ .userdata = s->userdata, .error = error, @@ -2231,7 +2243,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, == 0) { // Relative timeout. fos[i] = NULL; - pfds[i] = (struct pollfd){ .fd = -1 }; + pfds[i] = (os_poll_file_handle){ .fd = -1 }; clock_subscription = s; break; } @@ -2239,7 +2251,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, default: // Unsupported event. fos[i] = NULL; - pfds[i] = (struct pollfd){ .fd = -1 }; + pfds[i] = (os_poll_file_handle){ .fd = -1 }; out[(*nevents)++] = (__wasi_event_t){ .userdata = s->userdata, .error = __WASI_ENOSYS, @@ -2283,7 +2295,7 @@ wasmtime_ssp_poll_oneoff(wasm_exec_env_t exec_env, struct fd_table *curfds, __wasi_filesize_t nbytes = 0; if (in[i].u.type == __WASI_EVENTTYPE_FD_READ) { int l; - if (ioctl(fos[i]->file_handle, FIONREAD, &l) == 0) + if (os_ioctl(fos[i]->file_handle, FIONREAD, &l) == 0) nbytes = (__wasi_filesize_t)l; } if ((pfds[i].revents & POLLNVAL) != 0) { @@ -2449,7 +2461,7 @@ wasi_addr_to_string(const __wasi_addr_t *addr, char *buf, size_t buflen) if (addr->kind == IPv4) { const char *format = "%u.%u.%u.%u"; - assert(buflen >= 16); + bh_assert(buflen >= 16); snprintf(buf, buflen, format, addr->addr.ip4.addr.n0, addr->addr.ip4.addr.n1, addr->addr.ip4.addr.n2, @@ -2461,14 +2473,13 @@ wasi_addr_to_string(const __wasi_addr_t *addr, char *buf, size_t buflen) const char *format = "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"; __wasi_addr_ip6_t ipv6 = addr->addr.ip6.addr; - assert(buflen >= 40); + bh_assert(buflen >= 40); snprintf(buf, buflen, format, ipv6.n0, ipv6.n1, ipv6.n2, ipv6.n3, ipv6.h0, ipv6.h1, ipv6.h2, ipv6.h3); return true; } - return false; } @@ -2575,9 +2586,11 @@ wasi_ssp_sock_connect(wasm_exec_env_t exec_env, struct fd_table *curfds, } error = fd_object_get(curfds, &fo, fd, __WASI_RIGHT_SOCK_BIND, 0); - if (error != __WASI_ESUCCESS) + if (error != __WASI_ESUCCESS) { return error; + } + /* Consume __wasi_addr_t */ ret = blocking_op_socket_connect(exec_env, fo->file_handle, buf, addr->kind == IPv4 ? addr->addr.ip4.port : addr->addr.ip6.port); @@ -2726,10 +2739,10 @@ wasi_ssp_sock_open(wasm_exec_env_t exec_env, struct fd_table *curfds, } if (SOCKET_DGRAM == socktype) { - assert(wasi_type == __WASI_FILETYPE_SOCKET_DGRAM); + bh_assert(wasi_type == __WASI_FILETYPE_SOCKET_DGRAM); } else { - assert(wasi_type == __WASI_FILETYPE_SOCKET_STREAM); + bh_assert(wasi_type == __WASI_FILETYPE_SOCKET_STREAM); } // TODO: base rights and inheriting rights ? @@ -2839,7 +2852,7 @@ wasmtime_ssp_sock_recv_from(wasm_exec_env_t exec_env, struct fd_table *curfds, { struct fd_object *fo; __wasi_errno_t error; - bh_sockaddr_t sockaddr; + bh_sockaddr_t sockaddr, *sockaddr_ptr = NULL; int ret; error = fd_object_get(curfds, &fo, sock, __WASI_RIGHT_FD_READ, 0); @@ -2847,14 +2860,26 @@ wasmtime_ssp_sock_recv_from(wasm_exec_env_t exec_env, struct fd_table *curfds, return error; } + // If the source address is not NULL, the caller is requesting the source + // address to be returned if the protocol supports it. If the value is + // NULL, the POSIX standard states that the address is not returned. + if (src_addr != NULL) { + sockaddr_ptr = &sockaddr; + } + + /* Consume bh_sockaddr_t instead of __wasi_addr_t */ ret = blocking_op_socket_recv_from(exec_env, fo->file_handle, buf, buf_len, - 0, &sockaddr); + 0, sockaddr_ptr); fd_object_release(exec_env, fo); if (-1 == ret) { return convert_errno(errno); } - bh_sockaddr_to_wasi_addr(&sockaddr, src_addr); + // If the source address is not NULL, we need to convert the sockaddr + // back to __wasi_addr_t format. + if (src_addr != NULL) { + bh_sockaddr_to_wasi_addr(sockaddr_ptr, src_addr); + } *recv_len = (size_t)ret; return __WASI_ESUCCESS; @@ -2912,6 +2937,7 @@ wasmtime_ssp_sock_send_to(wasm_exec_env_t exec_env, struct fd_table *curfds, wasi_addr_to_bh_sockaddr(dest_addr, &sockaddr); + /* Consume bh_sockaddr instead of __wasi_addr_t */ ret = blocking_op_socket_send_to(exec_env, fo->file_handle, buf, buf_len, 0, &sockaddr); fd_object_release(exec_env, fo); @@ -2943,8 +2969,10 @@ wasmtime_ssp_sock_shutdown(wasm_exec_env_t exec_env, struct fd_table *curfds, __wasi_errno_t wasmtime_ssp_sched_yield(void) { -#ifdef BH_PLATFORM_WINDOWS +#if defined(BH_PLATFORM_WINDOWS) SwitchToThread(); +#elif defined(BH_PLATFORM_ZEPHYR) + k_yield(); #else if (sched_yield() < 0) return convert_errno(errno); diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c index 29c50dd870..665a9de918 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/random.c @@ -66,6 +66,20 @@ random_buf(void *buf, size_t len) return ret ? __WASI_EINVAL : __WASI_ESUCCESS; } +#elif defined(BH_PLATFORM_ZEPHYR) +#include +// Maybe having an OS abstraction api would be a good idea +// because every platform is implementing this function. +// we could have a function like `os_random_buf` +// and call `os_random_buf.` in the SSP wrapper `random_buf`. + +__wasi_errno_t +random_buf(void *buf, size_t len) +{ + sys_rand_get(buf, len); + return __WASI_ESUCCESS; +} + #else static int urandom = -1; diff --git a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h index 8296772131..9eeea99895 100644 --- a/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h +++ b/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/ssp_config.h @@ -42,7 +42,8 @@ #define CONFIG_HAS_GETRANDOM 0 #endif -#if defined(__CloudABI__) || defined(BH_PLATFORM_FREERTOS) +#if defined(__CloudABI__) || defined(BH_PLATFORM_FREERTOS) \ + || defined(BH_PLATFORM_ZEPHYR) #define CONFIG_HAS_CAP_ENTER 1 #else #define CONFIG_HAS_CAP_ENTER 0 @@ -50,7 +51,7 @@ #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__EMSCRIPTEN__) \ && !defined(ESP_PLATFORM) && !defined(DISABLE_CLOCK_NANOSLEEP) \ - && !defined(BH_PLATFORM_FREERTOS) + && !defined(BH_PLATFORM_FREERTOS) && !defined(BH_PLATFORM_ZEPHYR) #define CONFIG_HAS_CLOCK_NANOSLEEP 1 #else #define CONFIG_HAS_CLOCK_NANOSLEEP 0 @@ -63,7 +64,8 @@ #endif #if !defined(__APPLE__) && !defined(BH_PLATFORM_LINUX_SGX) && !defined(_WIN32) \ - && !defined(__COSMOPOLITAN__) && !defined(BH_PLATFORM_FREERTOS) + && !defined(__COSMOPOLITAN__) && !defined(BH_PLATFORM_FREERTOS) \ + && !defined(BH_PLATFORM_ZEPHYR) #define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 1 #else #define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 0 diff --git a/core/iwasm/libraries/thread-mgr/thread_manager.c b/core/iwasm/libraries/thread-mgr/thread_manager.c index 8f3a6317ba..5a647a9b64 100644 --- a/core/iwasm/libraries/thread-mgr/thread_manager.c +++ b/core/iwasm/libraries/thread-mgr/thread_manager.c @@ -501,13 +501,16 @@ wasm_cluster_spawn_exec_env(WASMExecEnv *exec_env) uint32 aux_stack_size; uint64 aux_stack_start; uint32 stack_size = 8192; + struct InstantiationArgs2 args; if (!module_inst || !(module = wasm_exec_env_get_module(exec_env))) { return NULL; } + wasm_runtime_instantiation_args_set_defaults(&args); + wasm_runtime_instantiation_args_set_default_stack_size(&args, stack_size); if (!(new_module_inst = wasm_runtime_instantiate_internal( - module, module_inst, exec_env, stack_size, 0, 0, NULL, 0))) { + module, module_inst, exec_env, &args, NULL, 0))) { return NULL; } diff --git a/core/iwasm/libraries/wasi-nn/README.md b/core/iwasm/libraries/wasi-nn/README.md index 2e926a0327..e16891a1ba 100644 --- a/core/iwasm/libraries/wasi-nn/README.md +++ b/core/iwasm/libraries/wasi-nn/README.md @@ -26,6 +26,7 @@ $ cmake -DWAMR_BUILD_WASI_NN=1 ... - `WAMR_BUILD_WASI_NN_TFLITE`. This option designates TensorFlow Lite as the backend. - `WAMR_BUILD_WASI_NN_OPENVINO`. This option designates OpenVINO as the backend. - `WAMR_BUILD_WASI_NN_LLAMACPP`. This option designates Llama.cpp as the backend. +- `WAMR_BUILD_WASI_NN_ONNX`. This option designates ONNX Runtime as the backend. ### Wasm @@ -151,7 +152,7 @@ docker run \ Supported: -- Graph encoding: `tensorflowlite`, `openvino` and `ggml` +- Graph encoding: `tensorflowlite`, `openvino`, `ggml` and `onnx` - Execution target: `cpu` for all. `gpu` and `tpu` for `tensorflowlite`. - Tensor type: `fp32`. diff --git a/core/iwasm/libraries/wasi-nn/cmake/Findonnxruntime.cmake b/core/iwasm/libraries/wasi-nn/cmake/Findonnxruntime.cmake new file mode 100644 index 0000000000..db8f287e36 --- /dev/null +++ b/core/iwasm/libraries/wasi-nn/cmake/Findonnxruntime.cmake @@ -0,0 +1,86 @@ +# Copyright 2025 Sony Semiconductor Solutions Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Find ONNX Runtime library +# +# This module defines the following variables: +# +# :: +# +# onnxruntime_FOUND - True if onnxruntime is found +# onnxruntime_INCLUDE_DIRS - Include directories for onnxruntime +# onnxruntime_LIBRARIES - List of libraries for onnxruntime +# onnxruntime_VERSION - Version of onnxruntime +# +# :: +# +# Example usage: +# +# find_package(onnxruntime) +# if(onnxruntime_FOUND) +# target_link_libraries(app onnxruntime) +# endif() + +# First try to find ONNX Runtime using the CMake config file +# FIXME: This is a temporary workaround for ONNX Runtime's broken CMake config on Linux. +# See https://github.com/microsoft/onnxruntime/issues/25279 +# Once the upstream issue is fixed, this conditional can be safely removed. +if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") + find_package(onnxruntime CONFIG QUIET) + if(onnxruntime_FOUND) + return() + endif() +endif() + +# If not found via CMake config, try to find manually +find_path(onnxruntime_INCLUDE_DIR + NAMES onnxruntime_c_api.h + PATHS + /usr/include + /usr/local/include + /opt/onnxruntime/include + $ENV{ONNXRUNTIME_ROOT}/include + ${CMAKE_CURRENT_LIST_DIR}/../../../../.. +) + +find_library(onnxruntime_LIBRARY + NAMES onnxruntime + PATHS + /usr/lib + /usr/local/lib + /opt/onnxruntime/lib + $ENV{ONNXRUNTIME_ROOT}/lib + ${CMAKE_CURRENT_LIST_DIR}/../../../../.. +) + +# Try to determine version from header file +if(onnxruntime_INCLUDE_DIR) + file(STRINGS "${onnxruntime_INCLUDE_DIR}/onnxruntime_c_api.h" onnxruntime_version_str + REGEX "^#define[\t ]+ORT_API_VERSION[\t ]+[0-9]+") + + if(onnxruntime_version_str) + string(REGEX REPLACE "^#define[\t ]+ORT_API_VERSION[\t ]+([0-9]+)" "\\1" + onnxruntime_VERSION "${onnxruntime_version_str}") + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(onnxruntime + REQUIRED_VARS onnxruntime_LIBRARY onnxruntime_INCLUDE_DIR + VERSION_VAR onnxruntime_VERSION +) + +if(onnxruntime_FOUND) + set(onnxruntime_LIBRARIES ${onnxruntime_LIBRARY}) + set(onnxruntime_INCLUDE_DIRS ${onnxruntime_INCLUDE_DIR}) + + if(NOT TARGET onnxruntime::onnxruntime) + add_library(onnxruntime::onnxruntime UNKNOWN IMPORTED) + set_target_properties(onnxruntime::onnxruntime PROPERTIES + IMPORTED_LOCATION "${onnxruntime_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_INCLUDE_DIRS}" + ) + endif() +endif() + +mark_as_advanced(onnxruntime_INCLUDE_DIR onnxruntime_LIBRARY) diff --git a/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake b/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake index b771b1c402..56a7b44e4a 100644 --- a/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake +++ b/core/iwasm/libraries/wasi-nn/cmake/wasi_nn.cmake @@ -109,3 +109,24 @@ if(WAMR_BUILD_WASI_NN_LLAMACPP EQUAL 1) install(TARGETS wasi_nn_llamacpp DESTINATION lib) endif() + +# - onnx +if(WAMR_BUILD_WASI_NN_ONNX EQUAL 1) + find_package(onnxruntime REQUIRED) + enable_language(CXX) + + add_library( + wasi_nn_onnx + SHARED + ${WASI_NN_ROOT}/src/wasi_nn_onnx.cpp + ) + + target_link_libraries( + wasi_nn_onnx + PUBLIC + vmlib + onnxruntime::onnxruntime + ) + + install(TARGETS wasi_nn_onnx DESTINATION lib) +endif() diff --git a/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c b/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c index 4d56fed93e..b44f45aac0 100644 --- a/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c +++ b/core/iwasm/libraries/wasi-nn/src/utils/wasi_nn_app_native.c @@ -108,9 +108,18 @@ tensor_data_app_native(wasm_module_inst_t instance, uint32_t total_elements, #define data_size total_elements #endif + uint64 data_size_in_bytes = data_size; +#if WASM_ENABLE_WASI_EPHEMERAL_NN == 0 + data_size_in_bytes *= sizeof(float); + if (data_size_in_bytes / sizeof(float) != data_size) { + /* overflow */ + return invalid_argument; + } +#endif + if (!wasm_runtime_validate_app_addr(instance, (uint64)input_tensor_wasm->data_offset, - (uint64)data_size)) { + data_size_in_bytes)) { NN_ERR_PRINTF("input_tensor_wasm->data_offset is invalid"); return invalid_argument; } diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c index fbd6e33f4b..2282534b0f 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn.c +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn.c @@ -33,6 +33,7 @@ #define TFLITE_BACKEND_LIB "libwasi_nn_tflite" LIB_EXTENTION #define OPENVINO_BACKEND_LIB "libwasi_nn_openvino" LIB_EXTENTION #define LLAMACPP_BACKEND_LIB "libwasi_nn_llamacpp" LIB_EXTENTION +#define ONNX_BACKEND_LIB "libwasi_nn_onnx" LIB_EXTENTION /* Global variables */ static korp_mutex wasi_nn_lock; @@ -65,7 +66,6 @@ wasi_nn_ctx_destroy(WASINNContext *wasi_nn_ctx) } NN_DBG_PRINTF("[WASI NN] DEINIT..."); NN_DBG_PRINTF("Freeing wasi-nn"); - NN_DBG_PRINTF("-> is_model_loaded: %d", wasi_nn_ctx->is_model_loaded); NN_DBG_PRINTF("-> current_encoding: %d", wasi_nn_ctx->backend); bh_assert(!wasi_nn_ctx->busy); @@ -201,15 +201,6 @@ wasi_nn_destroy() } /* Utils */ -static wasi_nn_error -is_model_initialized(WASINNContext *wasi_nn_ctx) -{ - if (!wasi_nn_ctx->is_model_loaded) { - NN_ERR_PRINTF("Model not initialized."); - return runtime_error; - } - return success; -} /* *TODO: choose a proper backend based on @@ -240,6 +231,17 @@ choose_a_backend() return openvino; } +#ifndef NDEBUG + NN_WARN_PRINTF("%s", dlerror()); +#endif + + handle = dlopen(ONNX_BACKEND_LIB, RTLD_LAZY); + if (handle) { + NN_INFO_PRINTF("Using onnx backend"); + dlclose(handle); + return onnx; + } + #ifndef NDEBUG NN_WARN_PRINTF("%s", dlerror()); #endif @@ -363,6 +365,8 @@ graph_encoding_to_backend_lib_name(graph_encoding encoding) return TFLITE_BACKEND_LIB; case ggml: return LLAMACPP_BACKEND_LIB; + case onnx: + return ONNX_BACKEND_LIB; default: return NULL; } @@ -496,8 +500,6 @@ wasi_nn_load(wasm_exec_env_t exec_env, graph_builder_array_wasm *builder, if (res != success) goto fail; - wasi_nn_ctx->is_model_loaded = true; - fail: // XXX: Free intermediate structure pointers if (builder_native.buf) @@ -507,10 +509,35 @@ wasi_nn_load(wasm_exec_env_t exec_env, graph_builder_array_wasm *builder, return res; } +static wasi_nn_error +copyin_and_nul_terminate(wasm_module_inst_t inst, char *name, uint32_t name_len, + char **resultp) +{ + char *nul_terminated_name; + if (!wasm_runtime_validate_native_addr(inst, name, name_len)) { + return invalid_argument; + } + nul_terminated_name = wasm_runtime_malloc(name_len + 1); + if (nul_terminated_name == NULL) { + return runtime_error; + } + bh_memcpy_s(nul_terminated_name, name_len + 1, name, name_len); + nul_terminated_name[name_len] = '\0'; /* ensure NUL termination */ + if (strlen(nul_terminated_name) != name_len) { + /* reject names containing '\0' for now */ + wasm_runtime_free(nul_terminated_name); + return invalid_argument; + } + *resultp = nul_terminated_name; + return success; +} + wasi_nn_error wasi_nn_load_by_name(wasm_exec_env_t exec_env, char *name, uint32_t name_len, graph *g) { + WASINNContext *wasi_nn_ctx = NULL; + char *nul_terminated_name = NULL; wasi_nn_error res; wasm_module_inst_t instance = wasm_runtime_get_module_inst(exec_env); @@ -518,25 +545,21 @@ wasi_nn_load_by_name(wasm_exec_env_t exec_env, char *name, uint32_t name_len, return runtime_error; } - if (!wasm_runtime_validate_native_addr(instance, name, name_len)) { - NN_ERR_PRINTF("name is invalid"); - return invalid_argument; - } - if (!wasm_runtime_validate_native_addr(instance, g, (uint64)sizeof(graph))) { NN_ERR_PRINTF("graph is invalid"); return invalid_argument; } - if (name_len == 0 || name[name_len] != '\0') { - NN_ERR_PRINTF("Invalid filename"); - return invalid_argument; + res = copyin_and_nul_terminate(instance, name, name_len, + &nul_terminated_name); + if (res != success) { + goto fail; } - NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME %s...", name); + NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME %s...", nul_terminated_name); - WASINNContext *wasi_nn_ctx = lock_ctx(instance); + wasi_nn_ctx = lock_ctx(instance); if (wasi_nn_ctx == NULL) { res = busy; goto fail; @@ -547,14 +570,19 @@ wasi_nn_load_by_name(wasm_exec_env_t exec_env, char *name, uint32_t name_len, goto fail; call_wasi_nn_func(wasi_nn_ctx->backend, load_by_name, res, - wasi_nn_ctx->backend_ctx, name, name_len, g); + wasi_nn_ctx->backend_ctx, nul_terminated_name, name_len, + g); if (res != success) goto fail; - wasi_nn_ctx->is_model_loaded = true; res = success; fail: - unlock_ctx(wasi_nn_ctx); + if (nul_terminated_name != NULL) { + wasm_runtime_free(nul_terminated_name); + } + if (wasi_nn_ctx != NULL) { + unlock_ctx(wasi_nn_ctx); + } return res; } @@ -563,6 +591,9 @@ wasi_nn_load_by_name_with_config(wasm_exec_env_t exec_env, char *name, int32_t name_len, char *config, int32_t config_len, graph *g) { + WASINNContext *wasi_nn_ctx = NULL; + char *nul_terminated_name = NULL; + char *nul_terminated_config = NULL; wasi_nn_error res; wasm_module_inst_t instance = wasm_runtime_get_module_inst(exec_env); @@ -570,30 +601,27 @@ wasi_nn_load_by_name_with_config(wasm_exec_env_t exec_env, char *name, return runtime_error; } - if (!wasm_runtime_validate_native_addr(instance, name, name_len)) { - NN_ERR_PRINTF("name is invalid"); - return invalid_argument; - } - if (!wasm_runtime_validate_native_addr(instance, g, (uint64)sizeof(graph))) { NN_ERR_PRINTF("graph is invalid"); return invalid_argument; } - if (name_len == 0 || name[name_len] != '\0') { - NN_ERR_PRINTF("Invalid filename"); - return invalid_argument; + res = copyin_and_nul_terminate(instance, name, name_len, + &nul_terminated_name); + if (res != success) { + goto fail; } - - if (!config || config_len == 0 || config[config_len] != '\0') { - NN_ERR_PRINTF("Invalid config"); - return invalid_argument; + res = copyin_and_nul_terminate(instance, config, config_len, + &nul_terminated_config); + if (res != success) { + goto fail; } - NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME_WITH_CONFIG %s %s...", name, config); + NN_DBG_PRINTF("[WASI NN] LOAD_BY_NAME_WITH_CONFIG %s %s...", + nul_terminated_name, nul_terminated_config); - WASINNContext *wasi_nn_ctx = lock_ctx(instance); + wasi_nn_ctx = lock_ctx(instance); if (wasi_nn_ctx == NULL) { res = busy; goto fail; @@ -605,15 +633,22 @@ wasi_nn_load_by_name_with_config(wasm_exec_env_t exec_env, char *name, ; call_wasi_nn_func(wasi_nn_ctx->backend, load_by_name_with_config, res, - wasi_nn_ctx->backend_ctx, name, name_len, config, - config_len, g); + wasi_nn_ctx->backend_ctx, nul_terminated_name, name_len, + nul_terminated_config, config_len, g); if (res != success) goto fail; - wasi_nn_ctx->is_model_loaded = true; res = success; fail: - unlock_ctx(wasi_nn_ctx); + if (nul_terminated_name != NULL) { + wasm_runtime_free(nul_terminated_name); + } + if (nul_terminated_config != NULL) { + wasm_runtime_free(nul_terminated_config); + } + if (wasi_nn_ctx != NULL) { + unlock_ctx(wasi_nn_ctx); + } return res; } @@ -635,9 +670,6 @@ wasi_nn_init_execution_context(wasm_exec_env_t exec_env, graph g, goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) - goto fail; - if (!wasm_runtime_validate_native_addr( instance, ctx, (uint64)sizeof(graph_execution_context))) { NN_ERR_PRINTF("ctx is invalid"); @@ -670,9 +702,6 @@ wasi_nn_set_input(wasm_exec_env_t exec_env, graph_execution_context ctx, goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) - goto fail; - tensor input_tensor_native = { 0 }; if (success != (res = tensor_app_native(instance, input_tensor, @@ -707,9 +736,6 @@ wasi_nn_compute(wasm_exec_env_t exec_env, graph_execution_context ctx) goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) - goto fail; - call_wasi_nn_func(wasi_nn_ctx->backend, compute, res, wasi_nn_ctx->backend_ctx, ctx); fail: @@ -743,8 +769,21 @@ wasi_nn_get_output(wasm_exec_env_t exec_env, graph_execution_context ctx, goto fail; } - if (success != (res = is_model_initialized(wasi_nn_ctx))) +#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + if (!wasm_runtime_validate_native_addr(instance, output_tensor, + output_tensor_len)) { + NN_ERR_PRINTF("output_tensor is invalid"); + res = invalid_argument; goto fail; + } +#else + if (!wasm_runtime_validate_native_addr(instance, output_tensor, + *output_tensor_size)) { + NN_ERR_PRINTF("output_tensor is invalid"); + res = invalid_argument; + goto fail; + } +#endif if (!wasm_runtime_validate_native_addr(instance, output_tensor_size, (uint64)sizeof(uint32_t))) { diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp b/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp new file mode 100644 index 0000000000..88587f68bc --- /dev/null +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn_onnx.cpp @@ -0,0 +1,795 @@ +/* + * Copyright 2025 Sony Semiconductor Solutions Corporation. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include +#include +#include +#include +#include +#include +#include "bh_platform.h" +#include "wasi_nn_backend.h" +#include "utils/logger.h" +#include "onnxruntime_c_api.h" + +#if WASM_ENABLE_WASI_EPHEMERAL_NN == 0 +#error This backend doesn't support legacy "wasi_nn" abi. Please enable WASM_ENABLE_WASI_EPHEMERAL_NN. +#endif + +/* Maximum number of graphs and execution contexts */ +#define MAX_GRAPHS 4 +#define MAX_CONTEXTS 4 + +/* Graph structure */ +typedef struct { + OrtSession *session; + bool is_initialized; +} OnnxRuntimeGraph; + +/* Execution context structure */ +typedef struct { + OrtMemoryInfo *memory_info; + std::vector input_names; + std::vector output_names; + std::unordered_map inputs; + std::unordered_map outputs; + OnnxRuntimeGraph *graph; + bool is_initialized; +} OnnxRuntimeExecCtx; + +/* ONNX Runtime context structure */ +typedef struct { + OrtEnv *env; + OrtSessionOptions *session_options; + OrtAllocator *allocator; + const OrtApi *ort_api; + std::mutex mutex; + bool is_initialized; + OnnxRuntimeGraph graphs[MAX_GRAPHS]; + OnnxRuntimeExecCtx exec_ctxs[MAX_CONTEXTS]; +} OnnxRuntimeContext; + +static wasi_nn_error +convert_ort_error_to_wasi_nn_error(const OnnxRuntimeContext *ctx, + OrtStatus *status) +{ + if (status == nullptr) { + return success; + } + + wasi_nn_error err; + OrtErrorCode code = ctx->ort_api->GetErrorCode(status); + const char *msg = ctx->ort_api->GetErrorMessage(status); + + NN_ERR_PRINTF("ONNX Runtime error: %s", msg); + + switch (code) { + case ORT_INVALID_ARGUMENT: + err = invalid_argument; + break; + case ORT_RUNTIME_EXCEPTION: + err = runtime_error; + break; + case ORT_NOT_IMPLEMENTED: + err = unsupported_operation; + break; + case ORT_INVALID_PROTOBUF: + err = invalid_encoding; + break; + case ORT_MODEL_LOADED: + err = too_large; + break; + case ORT_INVALID_GRAPH: + err = invalid_encoding; + break; + default: + err = runtime_error; + break; + } + + ctx->ort_api->ReleaseStatus(status); + return err; +} + +static bool +convert_wasi_nn_type_to_ort_type(tensor_type type, + ONNXTensorElementDataType *ort_type) +{ + switch (type) { + case fp32: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT; + break; + case fp16: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16; + break; + case fp64: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE; + break; + case u8: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8; + break; + case i32: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32; + break; + case i64: + *ort_type = ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64; + break; + default: + NN_WARN_PRINTF("Unsupported wasi-nn tensor type: %d", type); + return false; + } + return true; +} + +/* Backend API implementation */ + +extern "C" { + +__attribute__((visibility("default"))) wasi_nn_error +init_backend(void **onnx_ctx) +{ + wasi_nn_error err = success; + OrtStatus *status = nullptr; + OnnxRuntimeContext *ctx = nullptr; + ctx = new OnnxRuntimeContext(); + ctx->ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + if (!ctx->ort_api) { + NN_ERR_PRINTF("Failed to get ONNX Runtime API"); + err = runtime_error; + goto fail; + } + + NN_INFO_PRINTF("Creating ONNX Runtime environment..."); + status = ctx->ort_api->CreateEnv(ORT_LOGGING_LEVEL_VERBOSE, "wasi-nn", + &ctx->env); + if (status != nullptr) { + const char *error_message = ctx->ort_api->GetErrorMessage(status); + err = convert_ort_error_to_wasi_nn_error(ctx, status); + NN_ERR_PRINTF("Failed to create ONNX Runtime environment: %s", + error_message); + goto fail; + } + NN_INFO_PRINTF("ONNX Runtime environment created successfully"); + + status = ctx->ort_api->CreateSessionOptions(&ctx->session_options); + if (status != nullptr) { + err = convert_ort_error_to_wasi_nn_error(ctx, status); + ctx->ort_api->ReleaseEnv(ctx->env); + NN_ERR_PRINTF("Failed to create ONNX Runtime session options"); + goto fail; + } + + status = ctx->ort_api->SetSessionGraphOptimizationLevel( + ctx->session_options, ORT_ENABLE_BASIC); + if (status != nullptr) { + err = convert_ort_error_to_wasi_nn_error(ctx, status); + ctx->ort_api->ReleaseSessionOptions(ctx->session_options); + ctx->ort_api->ReleaseEnv(ctx->env); + NN_ERR_PRINTF("Failed to set graph optimization level"); + goto fail; + } + + status = ctx->ort_api->GetAllocatorWithDefaultOptions(&ctx->allocator); + if (status != nullptr) { + err = convert_ort_error_to_wasi_nn_error(ctx, status); + ctx->ort_api->ReleaseSessionOptions(ctx->session_options); + ctx->ort_api->ReleaseEnv(ctx->env); + NN_ERR_PRINTF("Failed to get default allocator"); + goto fail; + } + + for (int i = 0; i < MAX_GRAPHS; i++) { + ctx->graphs[i].is_initialized = false; + ctx->graphs[i].session = nullptr; + } + + for (int i = 0; i < MAX_CONTEXTS; i++) { + ctx->exec_ctxs[i].is_initialized = false; + ctx->exec_ctxs[i].memory_info = nullptr; + ctx->exec_ctxs[i].graph = nullptr; + ctx->exec_ctxs[i].input_names.clear(); + ctx->exec_ctxs[i].output_names.clear(); + ctx->exec_ctxs[i].inputs.clear(); + ctx->exec_ctxs[i].outputs.clear(); + } + + ctx->is_initialized = true; + *onnx_ctx = ctx; + + NN_INFO_PRINTF("ONNX Runtime backend initialized"); + return success; + +fail: + delete (ctx); + return err; +} + +__attribute__((visibility("default"))) wasi_nn_error +deinit_backend(void *onnx_ctx) +{ + OnnxRuntimeContext *ctx = (OnnxRuntimeContext *)onnx_ctx; + std::lock_guard lock(ctx->mutex); + + if (!ctx->is_initialized) { + return success; + } + + for (int i = 0; i < MAX_GRAPHS; i++) { + if (ctx->graphs[i].is_initialized) { + ctx->ort_api->ReleaseSession(ctx->graphs[i].session); + ctx->graphs[i].is_initialized = false; + } + } + + for (int i = 0; i < MAX_CONTEXTS; i++) { + if (ctx->exec_ctxs[i].is_initialized) { + for (auto &input : ctx->exec_ctxs[i].inputs) { + ctx->ort_api->ReleaseValue(input.second); + } + for (auto &output : ctx->exec_ctxs[i].outputs) { + ctx->ort_api->ReleaseValue(output.second); + } + + for (auto name : ctx->exec_ctxs[i].input_names) { + free((void *)name); + } + ctx->exec_ctxs[i].input_names.clear(); + + for (auto name : ctx->exec_ctxs[i].output_names) { + free((void *)name); + } + ctx->exec_ctxs[i].output_names.clear(); + + ctx->ort_api->ReleaseMemoryInfo(ctx->exec_ctxs[i].memory_info); + ctx->exec_ctxs[i].is_initialized = false; + } + } + + ctx->ort_api->ReleaseSessionOptions(ctx->session_options); + ctx->ort_api->ReleaseEnv(ctx->env); + ctx->is_initialized = false; + + delete (ctx); + + NN_INFO_PRINTF("ONNX Runtime backend deinitialized"); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +load(void *onnx_ctx, graph_builder_array *builder, graph_encoding encoding, + execution_target target, graph *g) +{ + if (!onnx_ctx) { + return runtime_error; + } + + if (encoding != onnx) { + NN_ERR_PRINTF("Unsupported encoding: %d", encoding); + return invalid_encoding; + } + + if (target != cpu) { + NN_ERR_PRINTF("Only CPU target is supported"); + return unsupported_operation; + } + + OnnxRuntimeContext *ctx = (OnnxRuntimeContext *)onnx_ctx; + std::lock_guard lock(ctx->mutex); + + int graph_index = -1; + for (int i = 0; i < MAX_GRAPHS; i++) { + if (!ctx->graphs[i].is_initialized) { + graph_index = i; + break; + } + } + + if (graph_index == -1) { + NN_ERR_PRINTF("Maximum number of graphs reached"); + return runtime_error; + } + + if (builder->size == 0 || builder->buf == NULL) { + NN_ERR_PRINTF("No model data provided"); + return invalid_argument; + } + + NN_INFO_PRINTF("[ONNX Runtime] Loading model of size %" PRIu32 " bytes...", + builder->buf[0].size); + + if (builder->buf[0].size > 16) { + NN_INFO_PRINTF( + "Model header bytes: %02x %02x %02x %02x %02x %02x %02x %02x", + ((uint8_t *)builder->buf[0].buf)[0], + ((uint8_t *)builder->buf[0].buf)[1], + ((uint8_t *)builder->buf[0].buf)[2], + ((uint8_t *)builder->buf[0].buf)[3], + ((uint8_t *)builder->buf[0].buf)[4], + ((uint8_t *)builder->buf[0].buf)[5], + ((uint8_t *)builder->buf[0].buf)[6], + ((uint8_t *)builder->buf[0].buf)[7]); + } + + OrtStatus *status = ctx->ort_api->CreateSessionFromArray( + ctx->env, builder->buf[0].buf, builder->buf[0].size, + ctx->session_options, &ctx->graphs[graph_index].session); + + if (status != nullptr) { + const char *error_message = ctx->ort_api->GetErrorMessage(status); + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ctx, status); + NN_ERR_PRINTF("Failed to create ONNX Runtime session: %s", + error_message); + return err; + } + + NN_INFO_PRINTF("ONNX Runtime session created successfully"); + + ctx->graphs[graph_index].is_initialized = true; + *g = graph_index; + + NN_INFO_PRINTF("ONNX model loaded as graph %d", graph_index); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +load_by_name(void *onnx_ctx, const char *name, uint32_t filename_len, graph *g) +{ + if (!onnx_ctx) { + return runtime_error; + } + + OnnxRuntimeContext *ctx = (OnnxRuntimeContext *)onnx_ctx; + std::lock_guard lock(ctx->mutex); + + int graph_index = -1; + for (int i = 0; i < MAX_GRAPHS; i++) { + if (!ctx->graphs[i].is_initialized) { + graph_index = i; + break; + } + } + + if (graph_index == -1) { + NN_ERR_PRINTF("Maximum number of graphs reached"); + return runtime_error; + } + + OrtStatus *status = + ctx->ort_api->CreateSession(ctx->env, name, ctx->session_options, + &ctx->graphs[graph_index].session); + + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ctx, status); + NN_ERR_PRINTF("Failed to create ONNX Runtime session from file: %s", + name); + return err; + } + + ctx->graphs[graph_index].is_initialized = true; + *g = graph_index; + + NN_INFO_PRINTF("ONNX model loaded from file %s as graph %d", name, + graph_index); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +init_execution_context(void *onnx_ctx, graph g, graph_execution_context *ctx) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (g >= MAX_GRAPHS || !ort_ctx->graphs[g].is_initialized) { + NN_ERR_PRINTF("Invalid graph handle: %d", g); + return invalid_argument; + } + + int ctx_index = -1; + for (int i = 0; i < MAX_CONTEXTS; i++) { + if (!ort_ctx->exec_ctxs[i].is_initialized) { + ctx_index = i; + break; + } + } + + if (ctx_index == -1) { + NN_ERR_PRINTF("Maximum number of execution contexts reached"); + return runtime_error; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx_index]; + exec_ctx->graph = &ort_ctx->graphs[g]; + + OrtStatus *status = ort_ctx->ort_api->CreateCpuMemoryInfo( + OrtArenaAllocator, OrtMemTypeDefault, &exec_ctx->memory_info); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to create CPU memory info"); + return err; + } + + size_t num_input_nodes; + status = ort_ctx->ort_api->SessionGetInputCount(exec_ctx->graph->session, + &num_input_nodes); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + NN_ERR_PRINTF("Failed to get input count"); + return err; + } + + for (size_t i = 0; i < num_input_nodes; i++) { + char *input_name; + status = ort_ctx->ort_api->SessionGetInputName( + exec_ctx->graph->session, i, ort_ctx->allocator, &input_name); + if (status != nullptr) { + wasi_nn_error err = + convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + NN_ERR_PRINTF("Failed to get input name"); + return err; + } + exec_ctx->input_names.push_back(input_name); + } + + size_t num_output_nodes; + status = ort_ctx->ort_api->SessionGetOutputCount(exec_ctx->graph->session, + &num_output_nodes); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + for (const char *name : exec_ctx->input_names) { + ort_ctx->allocator->Free(ort_ctx->allocator, (void *)name); + } + NN_ERR_PRINTF("Failed to get output count"); + return err; + } + + for (size_t i = 0; i < num_output_nodes; i++) { + char *output_name; + status = ort_ctx->ort_api->SessionGetOutputName( + exec_ctx->graph->session, i, ort_ctx->allocator, &output_name); + if (status != nullptr) { + wasi_nn_error err = + convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseMemoryInfo(exec_ctx->memory_info); + for (const char *name : exec_ctx->input_names) { + ort_ctx->allocator->Free(ort_ctx->allocator, (void *)name); + } + NN_ERR_PRINTF("Failed to get output name"); + return err; + } + exec_ctx->output_names.push_back(output_name); + } + + exec_ctx->is_initialized = true; + *ctx = ctx_index; + + NN_INFO_PRINTF("Execution context %d initialized for graph %d", ctx_index, + g); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +set_input(void *onnx_ctx, graph_execution_context ctx, uint32_t index, + tensor *input_tensor) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (ctx >= MAX_CONTEXTS || !ort_ctx->exec_ctxs[ctx].is_initialized) { + NN_ERR_PRINTF("Invalid execution context handle: %d", ctx); + return invalid_argument; + } + + if (index >= ort_ctx->exec_ctxs[ctx].input_names.size()) { + NN_ERR_PRINTF("Invalid input index: %d (max: %zu)", index, + ort_ctx->exec_ctxs[ctx].input_names.size() - 1); + return invalid_argument; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx]; + + OrtTypeInfo *type_info = nullptr; + OrtStatus *status = ort_ctx->ort_api->SessionGetInputTypeInfo( + exec_ctx->graph->session, index, &type_info); + if (status != nullptr) { + ort_ctx->ort_api->ReleaseTypeInfo(type_info); + return runtime_error; + } + + const OrtTensorTypeAndShapeInfo *tensor_info; + status = + ort_ctx->ort_api->CastTypeInfoToTensorInfo(type_info, &tensor_info); + if (status != nullptr) { + ort_ctx->ort_api->ReleaseTypeInfo(type_info); + return runtime_error; + } + + size_t num_model_dims; + status = ort_ctx->ort_api->GetDimensionsCount(tensor_info, &num_model_dims); + std::vector model_dims(num_model_dims); + status = ort_ctx->ort_api->GetDimensions(tensor_info, model_dims.data(), + num_model_dims); + + void *input_tensor_data = input_tensor->data.buf; + void *input_tensor_scaled_data = NULL; + ort_ctx->ort_api->ReleaseTypeInfo(type_info); + size_t num_dims = input_tensor->dimensions->size; + int64_t *ort_dims = (int64_t *)malloc(num_dims * sizeof(int64_t)); + if (!ort_dims) { + NN_ERR_PRINTF("Failed to allocate memory for tensor dimensions"); + return runtime_error; + } + + for (size_t i = 0; i < num_dims; i++) { + ort_dims[i] = input_tensor->dimensions->buf[i]; + } + + ONNXTensorElementDataType ort_type; + if (!convert_wasi_nn_type_to_ort_type( + static_cast(input_tensor->type), &ort_type)) { + NN_ERR_PRINTF("Failed to convert tensor type"); + return runtime_error; + } + + OrtValue *input_value = nullptr; + size_t total_elements = 1; + for (size_t i = 0; i < num_dims; i++) { + total_elements *= input_tensor->dimensions->buf[i]; + } + + status = ort_ctx->ort_api->CreateTensorWithDataAsOrtValue( + exec_ctx->memory_info, input_tensor->data.buf, input_tensor->data.size, + ort_dims, num_dims, ort_type, &input_value); + + free(ort_dims); + + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to create input tensor"); + return err; + } + + if (exec_ctx->inputs.count(index) > 0) { + ort_ctx->ort_api->ReleaseValue(exec_ctx->inputs[index]); + } + exec_ctx->inputs[index] = input_value; + + NN_INFO_PRINTF("Input tensor set for context %d, index %d", ctx, index); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +compute(void *onnx_ctx, graph_execution_context ctx) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (ctx >= MAX_CONTEXTS || !ort_ctx->exec_ctxs[ctx].is_initialized) { + NN_ERR_PRINTF("Invalid execution context handle: %d", ctx); + return invalid_argument; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx]; + + std::vector input_values; + std::vector input_names; + + for (size_t i = 0; i < exec_ctx->input_names.size(); i++) { + if (exec_ctx->inputs.count(i) == 0) { + NN_ERR_PRINTF("Input tensor not set for index %zu", i); + return invalid_argument; + } + input_values.push_back(exec_ctx->inputs[i]); + input_names.push_back(exec_ctx->input_names[i]); + } + + for (auto &output : exec_ctx->outputs) { + ort_ctx->ort_api->ReleaseValue(output.second); + } + exec_ctx->outputs.clear(); + + std::vector output_values(exec_ctx->output_names.size()); + + OrtStatus *status = ort_ctx->ort_api->Run( + exec_ctx->graph->session, nullptr, input_names.data(), + input_values.data(), input_values.size(), exec_ctx->output_names.data(), + exec_ctx->output_names.size(), output_values.data()); + + for (size_t i = 0; i < output_values.size(); i++) { + exec_ctx->outputs[i] = output_values[i]; + } + + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to run inference"); + return err; + } + + NN_INFO_PRINTF("Inference computed for context %d", ctx); + return success; +} + +__attribute__((visibility("default"))) wasi_nn_error +get_output(void *onnx_ctx, graph_execution_context ctx, uint32_t index, + tensor_data *out_buffer, uint32_t *out_buffer_size) +{ + OnnxRuntimeContext *ort_ctx = (OnnxRuntimeContext *)onnx_ctx; + if (!onnx_ctx) { + return runtime_error; + } + + std::lock_guard lock(ort_ctx->mutex); + + if (ctx >= MAX_CONTEXTS || !ort_ctx->exec_ctxs[ctx].is_initialized) { + NN_ERR_PRINTF("Invalid execution context handle: %d", ctx); + return invalid_argument; + } + + if (index >= ort_ctx->exec_ctxs[ctx].output_names.size()) { + NN_ERR_PRINTF("Invalid output index: %d (max: %zu)", index, + ort_ctx->exec_ctxs[ctx].output_names.size() - 1); + return invalid_argument; + } + + OnnxRuntimeExecCtx *exec_ctx = &ort_ctx->exec_ctxs[ctx]; + + OrtValue *output_value = exec_ctx->outputs[index]; + if (!output_value) { + NN_ERR_PRINTF("Output tensor not available for index %d", index); + return runtime_error; + } + + OrtTensorTypeAndShapeInfo *tensor_info; + OrtStatus *status = + ort_ctx->ort_api->GetTensorTypeAndShape(output_value, &tensor_info); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to get tensor type and shape"); + return err; + } + + ONNXTensorElementDataType element_type; + status = ort_ctx->ort_api->GetTensorElementType(tensor_info, &element_type); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor element type"); + return err; + } + + size_t num_dims; + status = ort_ctx->ort_api->GetDimensionsCount(tensor_info, &num_dims); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor dimensions count"); + return err; + } + + int64_t *dims = (int64_t *)malloc(num_dims * sizeof(int64_t)); + if (!dims) { + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to allocate memory for tensor dimensions"); + return runtime_error; + } + + status = ort_ctx->ort_api->GetDimensions(tensor_info, dims, num_dims); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + free(dims); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor dimensions"); + return err; + } + + size_t tensor_size; + status = + ort_ctx->ort_api->GetTensorShapeElementCount(tensor_info, &tensor_size); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + free(dims); + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + NN_ERR_PRINTF("Failed to get tensor element count"); + return err; + } + + NN_INFO_PRINTF("Output tensor dimensions: "); + for (size_t i = 0; i < num_dims; i++) { + NN_INFO_PRINTF(" dim[%zu] = %lld", i, dims[i]); + } + NN_INFO_PRINTF("Total elements: %zu", tensor_size); + + ort_ctx->ort_api->ReleaseTensorTypeAndShapeInfo(tensor_info); + free(dims); + + if (tensor_size == 0) { + NN_ERR_PRINTF("Tensor is empty (zero elements)"); + return runtime_error; + } + + void *tensor_data = nullptr; + status = ort_ctx->ort_api->GetTensorMutableData(output_value, &tensor_data); + if (status != nullptr) { + wasi_nn_error err = convert_ort_error_to_wasi_nn_error(ort_ctx, status); + NN_ERR_PRINTF("Failed to get tensor data"); + return err; + } + + if (tensor_data == nullptr) { + NN_ERR_PRINTF("Tensor data pointer is null"); + return runtime_error; + } + + size_t element_size; + switch (element_type) { + case ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT: + element_size = sizeof(float); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16: + element_size = sizeof(uint16_t); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE: + element_size = sizeof(double); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32: + element_size = sizeof(int32_t); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64: + element_size = sizeof(int64_t); + break; + case ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8: + element_size = sizeof(uint8_t); + break; + default: + NN_ERR_PRINTF("Unsupported tensor element type: %d", element_type); + return unsupported_operation; + } + + size_t output_size_bytes = tensor_size * element_size; + if (out_buffer->size < output_size_bytes) { + NN_ERR_PRINTF( + "Output buffer too small: %u bytes provided, %zu bytes needed", + out_buffer->size, output_size_bytes); + *out_buffer_size = output_size_bytes; + return too_large; + } + NN_INFO_PRINTF("Output tensor size: %zu elements, element size: %zu bytes, " + "total: %zu bytes", + tensor_size, element_size, output_size_bytes); + + if (tensor_data == nullptr) { + NN_ERR_PRINTF("Tensor data is null"); + return runtime_error; + } + + if (out_buffer->buf == nullptr) { + NN_ERR_PRINTF("Output buffer is null"); + return invalid_argument; + } + + memcpy(out_buffer->buf, tensor_data, output_size_bytes); + *out_buffer_size = output_size_bytes; + + NN_INFO_PRINTF( + "Output tensor retrieved for context %d, index %d, size %zu bytes", ctx, + index, output_size_bytes); + return success; +} + +} /* End of extern "C" */ diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h b/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h index 466f2cef45..1bff2c514d 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn_private.h @@ -15,7 +15,6 @@ typedef struct { korp_mutex lock; bool busy; bool is_backend_ctx_initialized; - bool is_model_loaded; graph_encoding backend; void *backend_ctx; } WASINNContext; diff --git a/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp b/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp index 819bd52aff..9ac54e6644 100644 --- a/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp +++ b/core/iwasm/libraries/wasi-nn/src/wasi_nn_tensorflowlite.cpp @@ -9,6 +9,7 @@ #include "wasi_nn_backend.h" #include "wasm_export.h" +#include #include #include #include @@ -279,29 +280,53 @@ set_input(void *tflite_ctx, graph_execution_context ctx, uint32_t index, tensor *input_tensor) { TFLiteContext *tfl_ctx = (TFLiteContext *)tflite_ctx; + TfLiteType tfl_type; - if (input_tensor->type != fp32) { - NN_ERR_PRINTF("unsupported input tensor type %u", input_tensor->type); - return runtime_error; + switch (input_tensor->type) { + case fp32: + tfl_type = TfLiteType::kTfLiteFloat32; + break; +#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + case u8: + tfl_type = TfLiteType::kTfLiteUInt8; + break; +#endif + default: + NN_ERR_PRINTF("unsupported input tensor type %u", + input_tensor->type); + return runtime_error; } wasi_nn_error res; if (success != (res = is_valid_graph_execution_context(tfl_ctx, ctx))) return res; - uint32_t num_tensors = - tfl_ctx->interpreters[ctx].interpreter->inputs().size(); + auto interpreter = tfl_ctx->interpreters[ctx].interpreter.get(); + + uint32_t num_tensors = interpreter->inputs().size(); NN_DBG_PRINTF("Number of tensors (%d)", num_tensors); if (index + 1 > num_tensors) { return runtime_error; } - auto tensor = tfl_ctx->interpreters[ctx].interpreter->input_tensor(index); + auto tensor = interpreter->input_tensor(index); if (tensor == NULL) { NN_ERR_PRINTF("Missing memory"); return too_large; } +#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 + if (TfLiteTensorType(tensor) != tfl_type) { + NN_ERR_PRINTF("Type mismatch"); + return runtime_error; + } + + if (TfLiteTensorCopyFromBuffer(tensor, input_tensor->data.buf, + input_tensor->data.size) + != kTfLiteOk) { + return runtime_error; + } +#else uint32_t model_tensor_size = 1; for (int i = 0; i < tensor->dims->size; ++i) model_tensor_size *= (uint32_t)tensor->dims->data[i]; @@ -346,6 +371,7 @@ set_input(void *tflite_ctx, graph_execution_context ctx, uint32_t index, it[i] = (uint8_t)(input_tensor_f[i] / scale + zero_point); } } +#endif return success; } @@ -388,14 +414,19 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, return too_large; } - if (tensor->quantization.type == kTfLiteNoQuantization) { - NN_DBG_PRINTF("No quantization information"); #if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - if (output_tensor->size < tensor->bytes) { - NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); - return too_large; - } + size_t sz = TfLiteTensorByteSize(tensor); + if (output_tensor->size < sz) { + NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); + return too_large; + } + if (TfLiteTensorCopyToBuffer(tensor, output_tensor->buf, sz) != kTfLiteOk) { + return runtime_error; + } + *output_tensor_size = sz; #else + if (tensor->quantization.type == kTfLiteNoQuantization) { + NN_DBG_PRINTF("No quantization information"); /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. @@ -404,18 +435,13 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); return too_large; } -#endif bh_memcpy_s(output_tensor->buf, output_tensor->size, tensor->data.data, tensor->bytes); -#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - *output_tensor_size = tensor->bytes; -#else /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. */ *output_tensor_size = tensor->bytes / sizeof(float); -#endif } else { // TODO: Assuming uint8 quantized networks. TfLiteAffineQuantization *quant_info = @@ -429,12 +455,6 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, for (int i = 0; i < (int)tensor->dims->size; ++i) model_tensor_size *= (uint32_t)tensor->dims->data[i]; -#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - if (output_tensor->size / sizeof(float) < model_tensor_size) { - NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); - return too_large; - } -#else /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. @@ -443,7 +463,6 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, NN_ERR_PRINTF("Insufficient memory to copy tensor %d", index); return too_large; } -#endif uint8_t *ot = tfl_ctx->interpreters[ctx] .interpreter->typed_output_tensor(index); @@ -458,16 +477,13 @@ get_output(void *tflite_ctx, graph_execution_context ctx, uint32_t index, output_tensor_f[i] = (ot[i] - zero_point) * scale; } -#if WASM_ENABLE_WASI_EPHEMERAL_NN != 0 - *output_tensor_size = model_tensor_size * sizeof(float); -#else /* * for now, maintain the bug-to-bug compatibility with the old abi, * where the size here is the number of fp32, not bytes. */ *output_tensor_size = model_tensor_size; -#endif } +#endif return success; } diff --git a/core/iwasm/libraries/wasi-nn/test/build.sh b/core/iwasm/libraries/wasi-nn/test/build.sh index 14f6b9e090..79d65d730c 100755 --- a/core/iwasm/libraries/wasi-nn/test/build.sh +++ b/core/iwasm/libraries/wasi-nn/test/build.sh @@ -14,6 +14,8 @@ # https://github.com/tensorflow/tensorflow/releases/tag/v2.16.1 # https://blog.tensorflow.org/2024/03/whats-new-in-tensorflow-216.html +set -e + CURR_PATH=$(cd $(dirname $0) && pwd -P) # WASM application that uses WASI-NN diff --git a/core/shared/mem-alloc/ems/ems_gc.c b/core/shared/mem-alloc/ems/ems_gc.c index 26e83a975c..e97a07bba3 100644 --- a/core/shared/mem-alloc/ems/ems_gc.c +++ b/core/shared/mem-alloc/ems/ems_gc.c @@ -6,7 +6,9 @@ #include "ems_gc.h" #include "ems_gc_internal.h" +#ifndef GB // Some platforms define already, causing build warnings. #define GB (1 << 30UL) +#endif #define MARK_NODE_OBJ_CNT 256 diff --git a/core/shared/mem-alloc/ems/ems_gc_internal.h b/core/shared/mem-alloc/ems/ems_gc_internal.h index c904942010..605d764dfa 100644 --- a/core/shared/mem-alloc/ems/ems_gc_internal.h +++ b/core/shared/mem-alloc/ems/ems_gc_internal.h @@ -338,8 +338,13 @@ typedef struct gc_heap_struct { static inline void gc_update_threshold(gc_heap_t *heap) { - heap->gc_threshold = - heap->total_free_size * heap->gc_threshold_factor / 1000; + uint64_t result = (uint64_t)heap->total_free_size + * (uint64_t)heap->gc_threshold_factor / 1000; + /* heap->total_free_size * heap->gc_threshold_factor won't exceed + * 6^32(GC_HEAP_SIZE_MAX * GC_DEFAULT_THRESHOLD_FACTOR), so casting result + * to uint32_t is safe + */ + heap->gc_threshold = (uint32_t)result; } #define gct_vm_mutex_init os_mutex_init diff --git a/core/shared/platform/alios/platform_internal.h b/core/shared/platform/alios/platform_internal.h index bdf3d073f3..c5032f9b2e 100644 --- a/core/shared/platform/alios/platform_internal.h +++ b/core/shared/platform/alios/platform_internal.h @@ -66,8 +66,12 @@ float fmaxf(float x, float y); float rintf(float x); float fabsf(float x); float truncf(float x); -int signbit(double x); -int isnan(double x); +int isnan_double(double x); +int isnan_float(float x); +int signbit_double(double x); +int signbit_float(float x); +#define isnan(x) (sizeof(x) == sizeof(double) ? isnan_double((double)x) : isnan_float(x)) +#define signbit(x) (sizeof(x) == sizeof(double) ? signbit_double((double)x) : signbit_float(x)) /* clang-format on */ /* The below types are used in platform_api_extension.h, @@ -75,6 +79,9 @@ int isnan(double x); typedef int os_file_handle; typedef void *os_dir_stream; typedef int os_raw_file_handle; +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/android/platform_internal.h b/core/shared/platform/android/platform_internal.h index 7abf863f81..6f74e3c78a 100644 --- a/core/shared/platform/android/platform_internal.h +++ b/core/shared/platform/android/platform_internal.h @@ -150,6 +150,12 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/common/math/math.c b/core/shared/platform/common/math/math.c index 2ba9f4d28b..3c0171570f 100644 --- a/core/shared/platform/common/math/math.c +++ b/core/shared/platform/common/math/math.c @@ -851,7 +851,7 @@ freebsd_floor(double x) i0 += 1; else { j = i1 + (1 << (52 - j0)); - if (j < i1) + if (j < (u_int32_t)i1) i0 += 1; /* got a carry */ i1 = j; } @@ -913,7 +913,7 @@ freebsd_ceil(double x) i0 += 1; else { j = i1 + (1 << (52 - j0)); - if (j < i1) + if (j < (u_int32_t)i1) i0 += 1; /* got a carry */ i1 = j; } @@ -1005,6 +1005,21 @@ freebsd_isnan(double d) } } +static int +freebsd_isnanf(float f) +{ + if (is_little_endian()) { + IEEEf2bits_L u; + u.f = f; + return (u.bits.exp == 0xff && u.bits.man != 0); + } + else { + IEEEf2bits_B u; + u.f = f; + return (u.bits.exp == 0xff && u.bits.man != 0); + } +} + static float freebsd_fabsf(float x) { @@ -1330,7 +1345,7 @@ freebsd_pow(double x, double y) k = (iy >> 20) - 0x3ff; /* exponent */ if (k > 20) { j = ly >> (52 - k); - if ((j << (52 - k)) == ly) + if (((u_int32_t)(j << (52 - k))) == ly) yisint = 2 - (j & 1); } else if (ly == 0) { @@ -1601,7 +1616,13 @@ fabs(double x) } int -isnan(double x) +isnan_float(float x) +{ + return freebsd_isnanf(x); +} + +int +isnan_double(double x) { return freebsd_isnan(x); } @@ -1613,7 +1634,15 @@ trunc(double x) } int -signbit(double x) +signbit_float(float x) +{ + unsigned int i; + GET_FLOAT_WORD(i, x); + return (int)(i >> 31); +} + +int +signbit_double(double x) { return ((__HI(x) & 0x80000000) >> 31); } diff --git a/core/shared/platform/common/math/platform_api_math.cmake b/core/shared/platform/common/math/platform_api_math.cmake index 09c74bfc50..6be55262bf 100644 --- a/core/shared/platform/common/math/platform_api_math.cmake +++ b/core/shared/platform/common/math/platform_api_math.cmake @@ -3,6 +3,6 @@ set (PLATFORM_COMMON_MATH_DIR ${CMAKE_CURRENT_LIST_DIR}) -file (GLOB_RECURSE source_all ${PLATFORM_COMMON_MATH_DIR}/*.c) +file (GLOB_RECURSE math_source_all ${PLATFORM_COMMON_MATH_DIR}/*.c) -set (PLATFORM_COMMON_MATH_SOURCE ${source_all} ) +set (PLATFORM_COMMON_MATH_SOURCE ${math_source_all} ) diff --git a/core/shared/platform/common/posix/posix_file.c b/core/shared/platform/common/posix/posix_file.c index d90f38ec5b..a05853f5e4 100644 --- a/core/shared/platform/common/posix/posix_file.c +++ b/core/shared/platform/common/posix/posix_file.c @@ -1039,3 +1039,31 @@ os_invalid_raw_handle(void) { return -1; } + +// Better to define the function here, as Linux-SGX will +// use this file to implement the `_os` functions. +// So we don't need to define them in the Linux-SGX platform. +int +os_ioctl(os_file_handle handle, int request, ...) +{ + int ret = -1; + va_list args; + + va_start(args, request); + ret = ioctl(handle, request, args); + va_end(args); + + return ret; +} + +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return poll(fds, nfs, timeout); +} + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2) +{ + return handle1 == handle2; +} diff --git a/core/shared/platform/common/posix/posix_socket.c b/core/shared/platform/common/posix/posix_socket.c index 89a13068f2..469b2a50c0 100644 --- a/core/shared/platform/common/posix/posix_socket.c +++ b/core/shared/platform/common/posix/posix_socket.c @@ -1035,4 +1035,4 @@ os_socket_addr_remote(bh_socket_t socket, bh_sockaddr_t *sockaddr) } return sockaddr_to_bh_sockaddr((struct sockaddr *)&addr_storage, sockaddr); -} +} \ No newline at end of file diff --git a/core/shared/platform/cosmopolitan/platform_internal.h b/core/shared/platform/cosmopolitan/platform_internal.h index 5c73ed5a65..10de33fe77 100644 --- a/core/shared/platform/cosmopolitan/platform_internal.h +++ b/core/shared/platform/cosmopolitan/platform_internal.h @@ -67,6 +67,9 @@ typedef sem_t korp_sem; typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/darwin/platform_internal.h b/core/shared/platform/darwin/platform_internal.h index 928aad7246..9446866224 100644 --- a/core/shared/platform/darwin/platform_internal.h +++ b/core/shared/platform/darwin/platform_internal.h @@ -112,6 +112,9 @@ os_set_signal_number_for_blocking_op(int signo); typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/esp-idf/espidf_file.c b/core/shared/platform/esp-idf/espidf_file.c index 4d78df38a0..04d31cb479 100644 --- a/core/shared/platform/esp-idf/espidf_file.c +++ b/core/shared/platform/esp-idf/espidf_file.c @@ -1039,3 +1039,15 @@ os_invalid_raw_handle(void) { return -1; } + +int +os_ioctl(os_file_handle handle, int request, ...) +{ + return BHT_ERROR; +} + +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return BHT_ERROR; +} diff --git a/core/shared/platform/esp-idf/espidf_thread.c b/core/shared/platform/esp-idf/espidf_thread.c index 768d823a8b..cb68df8bdf 100644 --- a/core/shared/platform/esp-idf/espidf_thread.c +++ b/core/shared/platform/esp-idf/espidf_thread.c @@ -110,6 +110,13 @@ os_thread_create_with_prio(korp_tid *tid, thread_start_routine_t start, targ->start = start; targ->arg = arg; +#ifdef CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM + esp_pthread_cfg_t default_config = esp_pthread_get_default_config(); + + default_config.stack_alloc_caps = MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM; + ESP_ERROR_CHECK(esp_pthread_set_cfg(&default_config)); +#endif + if (pthread_create(tid, &tattr, os_thread_wrapper, targ) != 0) { pthread_attr_destroy(&tattr); os_free(targ); diff --git a/core/shared/platform/esp-idf/platform_internal.h b/core/shared/platform/esp-idf/platform_internal.h index 580a06d907..a704bb0fb2 100644 --- a/core/shared/platform/esp-idf/platform_internal.h +++ b/core/shared/platform/esp-idf/platform_internal.h @@ -144,6 +144,12 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/freebsd/platform_internal.h b/core/shared/platform/freebsd/platform_internal.h index 01a6e824fc..8d6160c36e 100644 --- a/core/shared/platform/freebsd/platform_internal.h +++ b/core/shared/platform/freebsd/platform_internal.h @@ -69,6 +69,9 @@ typedef sem_t korp_sem; typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; #if WASM_DISABLE_HW_BOUND_CHECK == 0 #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64) \ diff --git a/core/shared/platform/include/platform_api_extension.h b/core/shared/platform/include/platform_api_extension.h index d57d0eac7c..41ec5742bc 100644 --- a/core/shared/platform/include/platform_api_extension.h +++ b/core/shared/platform/include/platform_api_extension.h @@ -1673,4 +1673,24 @@ os_clock_time_get(__wasi_clockid_t clock_id, __wasi_timestamp_t precision, } #endif +/* Experimental */ + +/* Used in posix.c around L2259 and expect the return code + * of ioctl() directly. + */ +int +os_ioctl(os_file_handle handle, int request, ...); + +/* Higher level API: + * __wasi_errno_t + * blocking_op_poll(wasm_exec_env_t exec_env, os_poll_file_handle *pfds, + * os_nfds_t nfds, int timeout_ms, int *retp) + * Already format the errno and expect the return code of poll() directly. + */ +int +os_poll(os_poll_file_handle *pfds, os_nfds_t nfs, int timeout); + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2); + #endif /* #ifndef PLATFORM_API_EXTENSION_H */ diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h index ac1a95ea1e..56ea7514ed 100644 --- a/core/shared/platform/include/platform_wasi_types.h +++ b/core/shared/platform/include/platform_wasi_types.h @@ -173,7 +173,7 @@ typedef uint8_t __wasi_eventtype_t; typedef uint32_t __wasi_exitcode_t; -typedef uint32_t __wasi_fd_t; +typedef int32_t __wasi_fd_t; typedef uint16_t __wasi_fdflags_t; #define __WASI_FDFLAG_APPEND (0x0001) @@ -539,7 +539,10 @@ typedef enum { typedef uint16_t __wasi_ip_port_t; -typedef enum { IPv4 = 0, IPv6 } __wasi_addr_type_t; +/* Ensure that __wasi_addr_type_t has a size of 4 byte (I32). + However, it will not have the type safety of enum. */ +typedef uint32_t __wasi_addr_type_t; +enum { IPv4 = 0, IPv6 }; /* n0.n1.n2.n3 */ typedef struct __wasi_addr_ip4_t { diff --git a/core/shared/platform/linux-sgx/platform_internal.h b/core/shared/platform/linux-sgx/platform_internal.h index 66960ad282..62f9a4482f 100644 --- a/core/shared/platform/linux-sgx/platform_internal.h +++ b/core/shared/platform/linux-sgx/platform_internal.h @@ -73,6 +73,16 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +struct _pollfd { + int fd; + short events; + short revents; +}; + +typedef struct _pollfd os_poll_file_handle; +typedef unsigned long os_nfds_t; +typedef struct timespec os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/linux-sgx/sgx_platform.c b/core/shared/platform/linux-sgx/sgx_platform.c index db350bc8f4..d259908634 100644 --- a/core/shared/platform/linux-sgx/sgx_platform.c +++ b/core/shared/platform/linux-sgx/sgx_platform.c @@ -131,8 +131,9 @@ os_is_handle_valid(os_file_handle *handle) /* implemented in posix_file.c */ #endif -void * -os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) +static void * +os_mmap_internal(void *hint, size_t size, int prot, int flags, + os_file_handle file, bool clear) { int mprot = 0; uint64 aligned_size, page_size; @@ -161,6 +162,10 @@ os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) return NULL; } + if (clear) { + memset(ret, 0, aligned_size); + } + if (prot & MMAP_PROT_READ) mprot |= SGX_PROT_READ; if (prot & MMAP_PROT_WRITE) @@ -179,6 +184,30 @@ os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) return ret; } +void * +os_mmap(void *hint, size_t size, int prot, int flags, os_file_handle file) +{ + return os_mmap_internal(hint, size, prot, flags, file, true); +} + +void * +os_mremap(void *old_addr, size_t old_size, size_t new_size) +{ + void *new_memory = + os_mmap_internal(NULL, new_size, MMAP_PROT_WRITE | MMAP_PROT_READ, 0, + os_get_invalid_handle(), false); + if (!new_memory) { + return NULL; + } + size_t copy_size = new_size < old_size ? new_size : old_size; + memcpy(new_memory, old_addr, copy_size); + if (new_size > copy_size) { + memset((char *)new_memory + copy_size, 0, new_size - copy_size); + } + os_munmap(old_addr, old_size); + return new_memory; +} + void os_munmap(void *addr, size_t size) { @@ -216,8 +245,10 @@ os_mprotect(void *addr, size_t size, int prot) void os_dcache_flush(void) -{} +{ +} void os_icache_flush(void *start, size_t len) -{} +{ +} diff --git a/core/shared/platform/linux-sgx/shared_platform.cmake b/core/shared/platform/linux-sgx/shared_platform.cmake index 9cd765be4e..e8e1670058 100644 --- a/core/shared/platform/linux-sgx/shared_platform.cmake +++ b/core/shared/platform/linux-sgx/shared_platform.cmake @@ -37,9 +37,6 @@ else() set(source_all ${source_all} ${PLATFORM_COMMON_LIBC_UTIL_SOURCE}) endif() -include (${CMAKE_CURRENT_LIST_DIR}/../common/memory/platform_api_memory.cmake) -set (source_all ${source_all} ${PLATFORM_COMMON_MEMORY_SOURCE}) - file (GLOB source_all_untrusted ${PLATFORM_SHARED_DIR}/untrusted/*.c) set (PLATFORM_SHARED_SOURCE ${source_all}) diff --git a/core/shared/platform/linux/platform_internal.h b/core/shared/platform/linux/platform_internal.h index 865180273e..b17abd2e48 100644 --- a/core/shared/platform/linux/platform_internal.h +++ b/core/shared/platform/linux/platform_internal.h @@ -126,6 +126,10 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; + static inline os_file_handle os_get_invalid_handle(void) { diff --git a/core/shared/platform/nuttx/platform_internal.h b/core/shared/platform/nuttx/platform_internal.h index fef2122da8..d746dda004 100644 --- a/core/shared/platform/nuttx/platform_internal.h +++ b/core/shared/platform/nuttx/platform_internal.h @@ -132,9 +132,14 @@ fdopendir(int fd); void os_set_signal_number_for_blocking_op(int signo); +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef struct timespec os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/riot/platform_internal.h b/core/shared/platform/riot/platform_internal.h index 11f2ba0a72..6eaae2caf0 100644 --- a/core/shared/platform/riot/platform_internal.h +++ b/core/shared/platform/riot/platform_internal.h @@ -63,6 +63,9 @@ typedef struct korp_cond { typedef int os_file_handle; typedef void *os_dir_stream; typedef int os_raw_file_handle; +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; #if WA_MATH /* clang-format off */ @@ -83,8 +86,12 @@ float fmaxf(float x, float y); float rintf(float x); float fabsf(float x); float truncf(float x); -int signbit(double x); -int isnan(double x); +int isnan_double(double x); +int isnan_float(float x); +int signbit_double(double x); +int signbit_float(float x); +#define isnan(x) (sizeof(x) == sizeof(double) ? isnan_double((double)x) : isnan_float(x)) +#define signbit(x) (sizeof(x) == sizeof(double) ? signbit_double((double)x) : signbit_float(x)) /* clang-format on */ #endif diff --git a/core/shared/platform/rt-thread/platform_internal.h b/core/shared/platform/rt-thread/platform_internal.h index b9b8c78c8f..b8e64b6c75 100644 --- a/core/shared/platform/rt-thread/platform_internal.h +++ b/core/shared/platform/rt-thread/platform_internal.h @@ -122,6 +122,9 @@ typedef rt_int64_t int64_t; typedef int os_file_handle; typedef void *os_dir_stream; typedef int os_raw_file_handle; +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef int os_timespec; static inline os_file_handle os_get_invalid_handle(void) diff --git a/core/shared/platform/vxworks/platform_internal.h b/core/shared/platform/vxworks/platform_internal.h index 6a6b00f4be..bf9d2885e0 100644 --- a/core/shared/platform/vxworks/platform_internal.h +++ b/core/shared/platform/vxworks/platform_internal.h @@ -65,6 +65,12 @@ typedef int os_file_handle; typedef DIR *os_dir_stream; typedef int os_raw_file_handle; +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef struct pollfd os_poll_file_handle; +typedef nfds_t os_nfds_t; +typedef timespec os_timespec; + #if WASM_DISABLE_HW_BOUND_CHECK == 0 #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64) \ || defined(BUILD_TARGET_AARCH64) diff --git a/core/shared/platform/windows/platform_internal.h b/core/shared/platform/windows/platform_internal.h index 8ff541016a..f77e1ad5a1 100644 --- a/core/shared/platform/windows/platform_internal.h +++ b/core/shared/platform/windows/platform_internal.h @@ -186,6 +186,12 @@ typedef uint32_t os_raw_file_handle; #define bh_socket_t windows_handle * +/* The below types are used in platform_api_extension.h, + we just define them to make the compiler happy */ +typedef int os_poll_file_handle; +typedef unsigned int os_nfds_t; +typedef struct timespec os_timespec; + // UWP apps do not have stdout/stderr handles so provide a default // implementation of vprintf on debug builds so output from WASI libc is sent to // the debugger and not lost completely. diff --git a/core/shared/platform/windows/win_file.c b/core/shared/platform/windows/win_file.c index 55ea77ac76..7cfda4cc3a 100644 --- a/core/shared/platform/windows/win_file.c +++ b/core/shared/platform/windows/win_file.c @@ -1816,3 +1816,39 @@ os_invalid_raw_handle(void) { return INVALID_HANDLE_VALUE; } + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2) +{ + if (handle1->type != handle2->type) { + return false; + } + + if (handle1->fdflags != handle2->fdflags + || handle1->access_mode != handle2->access_mode) { + return false; + } + + switch (handle1->type) { + case windows_handle_type_file: + return handle1->raw.handle == handle2->raw.handle; + case windows_handle_type_socket: + return handle1->raw.socket == handle2->raw.socket; + default: + // Unknown handle type + return false; + } +} + +int +os_ioctl(os_file_handle handle, int request, ...) +{ + return BHT_ERROR; +} + +// Should not be called because locked by ifdef. +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return BHT_ERROR; +} diff --git a/core/shared/platform/zephyr/platform_internal.h b/core/shared/platform/zephyr/platform_internal.h index 5bc9ca986c..134b5c2b5f 100644 --- a/core/shared/platform/zephyr/platform_internal.h +++ b/core/shared/platform/zephyr/platform_internal.h @@ -50,6 +50,7 @@ #include #include #include +#include #endif /* end of KERNEL_VERSION_NUMBER < 0x030200 */ #ifdef CONFIG_USERSPACE @@ -79,29 +80,51 @@ #define BH_PLATFORM_ZEPHYR #endif -// Synchronization primitives for usermode +#include + +#ifndef PATH_MAX +#define PATH_MAX 256 +#endif + +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif + +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif + +#ifndef STDERR_FILENO +#define STDERR_FILENO 2 +#endif + +/* Synchronization primitives for usermode. + * The macros are prefixed with 'z' because when building + * with WAMR_BUILD_LIBC_WASI the same functions are defined, + * and used in the sandboxed-system-primitives (see locking.h) + */ #ifdef CONFIG_USERSPACE -#define mutex_t struct sys_mutex -#define mutex_init(mtx) sys_mutex_init(mtx) -#define mutex_lock(mtx, timeout) sys_mutex_lock(mtx, timeout) -#define mutex_unlock(mtx) sys_mutex_unlock(mtx) - -#define sem_t struct sys_sem -#define sem_init(sem, init_count, limit) sys_sem_init(sem, init_count, limit) -#define sem_give(sem) sys_sem_give(sem) -#define sem_take(sem, timeout) sys_sem_take(sem, timeout) -#define sem_count_get(sem) sys_sem_count_get(sem) +#define zmutex_t struct sys_mutex +#define zmutex_init(mtx) sys_mutex_init(mtx) +#define zmutex_lock(mtx, timeout) sys_mutex_lock(mtx, timeout) +#define zmutex_unlock(mtx) sys_mutex_unlock(mtx) + +#define zsem_t struct sys_sem +#define zsem_init(sem, init_count, limit) sys_sem_init(sem, init_count, limit) +#define zsem_give(sem) sys_sem_give(sem) +#define zsem_take(sem, timeout) sys_sem_take(sem, timeout) +#define zsem_count_get(sem) sys_sem_count_get(sem) #else /* else of CONFIG_USERSPACE */ -#define mutex_t struct k_mutex -#define mutex_init(mtx) k_mutex_init(mtx) -#define mutex_lock(mtx, timeout) k_mutex_lock(mtx, timeout) -#define mutex_unlock(mtx) k_mutex_unlock(mtx) - -#define sem_t struct k_sem -#define sem_init(sem, init_count, limit) k_sem_init(sem, init_count, limit) -#define sem_give(sem) k_sem_give(sem) -#define sem_take(sem, timeout) k_sem_take(sem, timeout) -#define sem_count_get(sem) k_sem_count_get(sem) +#define zmutex_t struct k_mutex +#define zmutex_init(mtx) k_mutex_init(mtx) +#define zmutex_lock(mtx, timeout) k_mutex_lock(mtx, timeout) +#define zmutex_unlock(mtx) k_mutex_unlock(mtx) + +#define zsem_t struct k_sem +#define zsem_init(sem, init_count, limit) k_sem_init(sem, init_count, limit) +#define zsem_give(sem) k_sem_give(sem) +#define zsem_take(sem, timeout) k_sem_take(sem, timeout) +#define zsem_count_get(sem) k_sem_count_get(sem) #endif /* end of CONFIG_USERSPACE */ #define BH_APPLET_PRESERVED_STACK_SIZE (2 * BH_KB) @@ -111,22 +134,32 @@ typedef struct k_thread korp_thread; typedef korp_thread *korp_tid; -typedef mutex_t korp_mutex; +typedef zmutex_t korp_mutex; typedef unsigned int korp_sem; /* korp_rwlock is used in platform_api_extension.h, we just define the type to make the compiler happy */ -typedef struct { - int dummy; -} korp_rwlock; - struct os_thread_wait_node; typedef struct os_thread_wait_node *os_thread_wait_list; typedef struct korp_cond { - mutex_t wait_list_lock; + zmutex_t wait_list_lock; os_thread_wait_list thread_wait_list; } korp_cond; +typedef struct { + struct k_mutex mtx; // Mutex for exclusive access + struct k_sem sem; // Semaphore for shared access + int read_count; // Number of readers +} korp_rwlock; + +// TODO: Conform to Zephyr POSIX definition of rwlock: +// struct posix_rwlock { +// struct k_sem rd_sem; +// struct k_sem wr_sem; +// struct k_sem reader_active; /* blocks WR till reader has acquired lock */ +// k_tid_t wr_owner; +// }; + #ifndef Z_TIMEOUT_MS #define Z_TIMEOUT_MS(ms) ms #endif @@ -156,12 +189,16 @@ float fmaxf(float x, float y); float rintf(float x); float fabsf(float x); float truncf(float x); -int isnan(double x); +int isnan_double(double x); +int isnan_float(float x); +#define isnan(x) (sizeof(x) == sizeof(double) ? isnan_double((double)x) : isnan_float(x)) double pow(double x, double y); double scalbn(double x, int n); #ifndef BH_HAS_SIGNBIT -int signbit(double x); +int signbit_double(double x); +int signbit_float(float x); +#define signbit(x) (sizeof(x) == sizeof(double) ? signbit_double((double)x) : signbit_float(x)) #endif unsigned long long int strtoull(const char *nptr, char **endptr, int base); @@ -204,14 +241,70 @@ set_exec_mem_alloc_func(exec_mem_alloc_func_t alloc_func, /* The below types are used in platform_api_extension.h, we just define them to make the compiler happy */ -typedef int os_file_handle; -typedef void *os_dir_stream; +typedef int os_dir_stream; typedef int os_raw_file_handle; +#define OS_DIR_STREAM_INVALID 0 + +// handle for file system descriptor +typedef struct zephyr_fs_desc { + char *path; + union { + struct fs_file_t file; + struct fs_dir_t dir; + }; + bool is_dir; + bool used; + uint32_t dir_index; // DSK: supprt for rewind and seek +} zephyr_fs_desc; + +// definition of zephyr_handle +typedef struct zephyr_handle { + int fd; + bool is_sock; +} zephyr_handle; + +typedef struct zephyr_handle *os_file_handle; +#define bh_socket_t zephyr_handle * + +typedef struct zsock_pollfd os_poll_file_handle; +typedef unsigned int os_nfds_t; + +// Some of these definitions will throw warning for macros +// redefinition if CONFIG_POSIX_API=y, but it's fine. +// Warning: the CONFIG_POSIX_API will surely be deprecated and +// split into more macros, so we may use some ifdefs to avoid +// the warning in the future. +#define POLLIN ZSOCK_POLLIN +#define POLLPRI ZSOCK_POLLPRI +#define POLLOUT ZSOCK_POLLOUT +#define POLLERR ZSOCK_POLLERR +#define POLLHUP ZSOCK_POLLHUP +#define POLLNVAL ZSOCK_POLLNVAL + +#define FIONREAD ZFD_IOCTL_FIONREAD + +typedef struct timespec os_timespec; + +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 1 +#endif + +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC 4 +#endif + +static inline int +os_sched_yield(void) +{ + k_yield(); + return 0; +} + static inline os_file_handle os_get_invalid_handle(void) { - return -1; + return NULL; } static inline int diff --git a/core/shared/platform/zephyr/shared_platform.cmake b/core/shared/platform/zephyr/shared_platform.cmake index dfd45a4064..f424b97204 100644 --- a/core/shared/platform/zephyr/shared_platform.cmake +++ b/core/shared/platform/zephyr/shared_platform.cmake @@ -8,11 +8,20 @@ add_definitions(-DBH_PLATFORM_ZEPHYR) include_directories(${PLATFORM_SHARED_DIR}) include_directories(${PLATFORM_SHARED_DIR}/../include) +file (GLOB_RECURSE source_all ${PLATFORM_SHARED_DIR}/*.c) + if(${CONFIG_MINIMAL_LIBC}) include (${CMAKE_CURRENT_LIST_DIR}/../common/math/platform_api_math.cmake) + set (source_all ${source_all} ${PLATFORM_COMMON_MATH_SOURCE}) endif() -file (GLOB_RECURSE source_all ${PLATFORM_SHARED_DIR}/*.c) - -set (PLATFORM_SHARED_SOURCE ${source_all} ${PLATFORM_COMMON_MATH_SOURCE}) +if (NOT WAMR_BUILD_LIBC_WASI EQUAL 1) + list(REMOVE_ITEM source_all ${PLATFORM_SHARED_DIR}/zephyr_socket.c) + list(REMOVE_ITEM source_all ${PLATFORM_SHARED_DIR}/zephyr_file.c) + list(REMOVE_ITEM source_all ${PLATFORM_SHARED_DIR}/zephyr_clock.c) +else() + include (${CMAKE_CURRENT_LIST_DIR}/../common/libc-util/platform_common_libc_util.cmake) + set(source_all ${source_all} ${PLATFORM_COMMON_LIBC_UTIL_SOURCE}) +endif () +set (PLATFORM_SHARED_SOURCE ${source_all}) diff --git a/core/shared/platform/zephyr/zephyr_clock.c b/core/shared/platform/zephyr/zephyr_clock.c new file mode 100644 index 0000000000..f8a8ab60ad --- /dev/null +++ b/core/shared/platform/zephyr/zephyr_clock.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "platform_api_extension.h" +#include "platform_api_vmcore.h" +#include "libc_errno.h" + +#include + +/* Notes: + * We are using the same implementation for __WASI_CLOCK_REALTIME and + * __WASI_CLOCK_MONOTONIC, because it is a practical solution when there + * is no RTC or external time source available. + * The implementation is based on the Zephyr `k_cycle_get_32()` function or + * the 64bits variant if available. + * We could have used `k_uptime_get()` instead, but it is not as precise, + * it has a millisecond resolution or depend on CONFIG_SYS_CLOCK_TICKS_PER_SEC. + * Feel free to change the implementation if you have a better solution. + * May look at + * https://github.com/zephyrproject-rtos/zephyr/blob/main/lib/posix/options/clock.c + * for reference. + */ + +#define NANOSECONDS_PER_SECOND 1000000000ULL + +__wasi_errno_t +os_clock_res_get(__wasi_clockid_t clock_id, __wasi_timestamp_t *resolution) +{ + switch (clock_id) { + case __WASI_CLOCK_PROCESS_CPUTIME_ID: + case __WASI_CLOCK_THREAD_CPUTIME_ID: + return __WASI_ENOTSUP; + case __WASI_CLOCK_REALTIME: + case __WASI_CLOCK_MONOTONIC: + *resolution = + NANOSECONDS_PER_SECOND / CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC; + return __WASI_ESUCCESS; + default: + return __WASI_EINVAL; + } +} + +__wasi_errno_t +os_clock_time_get(__wasi_clockid_t clock_id, __wasi_timestamp_t precision, + __wasi_timestamp_t *time) +{ + (void)precision; + + switch (clock_id) { + case __WASI_CLOCK_PROCESS_CPUTIME_ID: + case __WASI_CLOCK_THREAD_CPUTIME_ID: + return __WASI_ENOTSUP; + case __WASI_CLOCK_REALTIME: + case __WASI_CLOCK_MONOTONIC: +#ifdef CONFIG_TIMER_HAS_64BIT_CYCLE_COUNTER + *time = k_cycle_get_64(); +#else + *time = k_cycle_get_32(); +#endif + return __WASI_ESUCCESS; + default: + return __WASI_EINVAL; + } +} \ No newline at end of file diff --git a/core/shared/platform/zephyr/zephyr_file.c b/core/shared/platform/zephyr/zephyr_file.c new file mode 100644 index 0000000000..1f48bc010c --- /dev/null +++ b/core/shared/platform/zephyr/zephyr_file.c @@ -0,0 +1,1198 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "platform_api_vmcore.h" +#include "platform_api_extension.h" +#include "libc_errno.h" + +#include +#include + +#include +#include +#include +#include + +/* Notes: + * This is the implementation of a POSIX-like file system interface for Zephyr. + * To manage our file descriptors, we created a struct `zephyr_fs_desc` that + * represent a zephyr file descriptor and hold useful informations. + * We also created a file descriptor table to keep track of all the file + * descriptors. + * + * To pass the file descriptor reference to the higher level abstraction, we + * pass the index of the fd table to an `os_file_handle` struct. + * Then in the WASI implementation layer we can retrieve the file descriptor + * reference. + * + * We also fake the stdin, stdout and stderr file descriptors. + * We do not handle write on stdin and read on stdin, stdout and stderr. + */ + +// No OS API wrapper (Zephyr): +// file: +// off_t fs_tell(struct fs_file_t *zfp) +// file system: +// int fs_mount(struct fs_mount_t *mp) +// int fs_unmount(struct fs_mount_t *mp +// int fs_readmount(int *index, const char **name) +// int fs_statvfs(const char *path, struct fs_statvfs *stat) +// int fs_mkfs(int fs_type, uintptr_t dev_id, void *cfg, int flags) +// int fs_register(int type, const struct fs_file_system_t *fs) +// int fs_unregister(int type, const struct fs_file_system_t *fs) + +// We will take the maximum number of open files +// from the Zephyr POSIX configuration +#define CONFIG_WASI_MAX_OPEN_FILES CONFIG_ZVFS_OPEN_MAX + +static inline bool +os_is_virtual_fd(int fd) +{ + switch (fd) { + case STDIN_FILENO: + case STDOUT_FILENO: + case STDERR_FILENO: + return true; + default: + return false; + }; +} + +// Macro to retrieve a file system descriptor and check it's validity. +// fd's 0-2 are reserved for standard streams, hence the by-3 offsets. +#define GET_FILE_SYSTEM_DESCRIPTOR(fd, ptr) \ + do { \ + if (os_is_virtual_fd(fd)) { \ + ptr = NULL; \ + break; \ + } \ + if (fd < 3 || fd >= CONFIG_WASI_MAX_OPEN_FILES + 3) { \ + return __WASI_EBADF; \ + } \ + k_mutex_lock(&desc_array_mutex, K_FOREVER); \ + ptr = &desc_array[(int)fd - 3]; \ + if (!ptr->used) { \ + k_mutex_unlock(&desc_array_mutex); \ + return __WASI_EBADF; \ + } \ + k_mutex_unlock(&desc_array_mutex); \ + } while (0) + +// Array to keep track of file system descriptors. +static struct zephyr_fs_desc desc_array[CONFIG_WASI_MAX_OPEN_FILES]; + +// mutex to protect the file descriptor array +K_MUTEX_DEFINE(desc_array_mutex); + +static char prestat_dir[MAX_FILE_NAME + 1]; + +bool +build_absolute_path(char *abs_path, size_t abs_path_len, const char *path) +{ + if (!path) { + abs_path[0] = '\0'; + return false; + } + + size_t len1 = strlen(prestat_dir); + size_t len2 = strlen(path); + + if (len1 + 1 + len2 + 1 > abs_path_len) { + abs_path[0] = '\0'; // Empty string on error + return false; // Truncation would occur + } + + snprintf(abs_path, abs_path_len, "%s/%s", prestat_dir, path); + return true; +} + +static struct zephyr_fs_desc * +zephyr_fs_alloc_obj(bool is_dir, const char *path, int *index) +{ + struct zephyr_fs_desc *ptr = NULL; + *index = -1; // give a default value to index in case table is full + + k_mutex_lock(&desc_array_mutex, K_FOREVER); + for (int i = 0; i < CONFIG_WASI_MAX_OPEN_FILES; i++) { + if (desc_array[i].used == false) { + ptr = &desc_array[i]; + ptr->used = true; + ptr->is_dir = is_dir; + ptr->path = bh_strdup(path); + ptr->dir_index = 0; + if (ptr->path == NULL) { + ptr->used = false; + k_mutex_unlock(&desc_array_mutex); + return NULL; + } + *index = i + 3; + break; + } + } + + k_mutex_unlock(&desc_array_mutex); + + if (ptr == NULL) { + printk("Error: all file descriptor slots are in use (max = %d)\n", + CONFIG_WASI_MAX_OPEN_FILES); + } + + return ptr; +} + +static inline void +zephyr_fs_free_obj(struct zephyr_fs_desc *ptr) +{ + BH_FREE(ptr->path); + ptr->path = NULL; + ptr->used = false; +} + +/* /!\ Needed for socket to work */ +__wasi_errno_t +os_fstat(os_file_handle handle, struct __wasi_filestat_t *buf) +{ + struct zephyr_fs_desc *ptr = NULL; + int socktype, rc; + + if (!handle->is_sock) { + + if (os_is_virtual_fd(handle->fd)) { + buf->st_filetype = __WASI_FILETYPE_CHARACTER_DEVICE; + buf->st_size = 0; + buf->st_atim = 0; + buf->st_mtim = 0; + buf->st_ctim = 0; + return __WASI_ESUCCESS; + } + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Get file information using Zephyr's fs_stat function + struct fs_dirent entry; + rc = fs_stat(ptr->path, &entry); + if (rc < 0) { + return convert_errno(-rc); + } + + // Fill in the __wasi_filestat_t structure + buf->st_dev = 0; // Zephyr's fs_stat doesn't provide a device ID + buf->st_ino = 0; // Zephyr's fs_stat doesn't provide an inode number + buf->st_filetype = entry.type == FS_DIR_ENTRY_DIR + ? __WASI_FILETYPE_DIRECTORY + : __WASI_FILETYPE_REGULAR_FILE; + buf->st_nlink = 1; // Zephyr's fs_stat doesn't provide a link count + buf->st_size = entry.size; + buf->st_atim = 0; // Zephyr's fs_stat doesn't provide timestamps + buf->st_mtim = 0; + buf->st_ctim = 0; + + return __WASI_ESUCCESS; + + // return os_fstatat(handle, ptr->path, buf, 0); + } + else { + // socklen_t socktypelen = sizeof(socktype); + // rc = zsock_getsockopt(handle->fd, SOL_SOCKET, SO_TYPE, &socktype, + // &socktypelen); Using `zsock_getsockopt` will add a dependency on the + // network stack + // TODO: may add a type to the `zephyr_handle`. + rc = 1; + socktype = SOCK_STREAM; + if (rc < 0) { + return convert_errno(-rc); + } + + switch (socktype) { + case SOCK_DGRAM: + buf->st_filetype = __WASI_FILETYPE_SOCKET_DGRAM; + break; + case SOCK_STREAM: + buf->st_filetype = __WASI_FILETYPE_SOCKET_STREAM; + break; + default: + buf->st_filetype = __WASI_FILETYPE_UNKNOWN; + break; + } + buf->st_size = 0; + buf->st_atim = 0; + buf->st_mtim = 0; + buf->st_ctim = 0; + return __WASI_ESUCCESS; + } +} + +__wasi_errno_t +os_fstatat(os_file_handle handle, const char *path, + struct __wasi_filestat_t *buf, __wasi_lookupflags_t lookup_flags) +{ + struct fs_dirent entry; + int rc; + + if (handle->fd < 0) { + return __WASI_EBADF; + } + + char abs_path[MAX_FILE_NAME + 1]; + + if (handle == NULL) { + return __WASI_EINVAL; // Or another appropriate error code + } + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + // Get file information using Zephyr's fs_stat function + rc = fs_stat(abs_path, &entry); + if (rc < 0) { + return convert_errno(-rc); + } + + // Fill in the __wasi_filestat_t structure + buf->st_dev = 0; // Zephyr's fs_stat doesn't provide a device ID + // DSK: setting this to 0, in addition to d_ino = 1 causes failures with + // readdir() So, here's a hack to to avoid this. + buf->st_ino = 1; // Zephyr's fs_stat doesn't provide an inode number. + buf->st_filetype = entry.type == FS_DIR_ENTRY_DIR + ? __WASI_FILETYPE_DIRECTORY + : __WASI_FILETYPE_REGULAR_FILE; + buf->st_nlink = 1; // Zephyr's fs_stat doesn't provide a link count + buf->st_size = entry.size; + buf->st_atim = 0; // Zephyr's fs_stat doesn't provide timestamps + buf->st_mtim = 0; + buf->st_ctim = 0; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_file_get_fdflags(os_file_handle handle, __wasi_fdflags_t *flags) +{ + struct zephyr_fs_desc *ptr = NULL; + + if (os_is_virtual_fd(handle->fd)) { + *flags = 0; + return __WASI_ESUCCESS; + } + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if ((ptr->file.flags & FS_O_APPEND) != 0) { + *flags |= __WASI_FDFLAG_APPEND; + } + /* Others flags: + * - __WASI_FDFLAG_DSYNC + * - __WASI_FDFLAG_RSYNC + * - __WASI_FDFLAG_SYNC + * - __WASI_FDFLAG_NONBLOCK + * Have no equivalent in Zephyr. + */ + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_file_set_fdflags(os_file_handle handle, __wasi_fdflags_t flags) +{ + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if ((flags & __WASI_FDFLAG_APPEND) != 0) { + ptr->file.flags |= FS_O_APPEND; + } + /* Same as above */ + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_fdatasync(os_file_handle handle) +{ + return os_fsync(handle); +} + +__wasi_errno_t +os_fsync(os_file_handle handle) +{ + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + int rc = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if (ptr->is_dir) { + return __WASI_EISDIR; + } + + rc = fs_sync(&ptr->file); + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_open_preopendir(const char *path, os_file_handle *out) +{ + int rc, index; + struct zephyr_fs_desc *ptr; + + *out = BH_MALLOC(sizeof(struct zephyr_handle)); + if (*out == NULL) { + return __WASI_ENOMEM; + } + + ptr = zephyr_fs_alloc_obj(true, path, &index); + if (ptr == NULL) { + BH_FREE(*out); + return __WASI_EMFILE; + } + + fs_dir_t_init(&ptr->dir); + + rc = fs_opendir(&ptr->dir, path); + if (rc < 0) { + zephyr_fs_free_obj(ptr); + BH_FREE(*out); + return convert_errno(-rc); + } + + (*out)->fd = index; + (*out)->is_sock = false; + + strncpy(prestat_dir, path, MAX_FILE_NAME + 1); + prestat_dir[MAX_FILE_NAME] = '\0'; + + return __WASI_ESUCCESS; +} + +static int +wasi_flags_to_zephyr(__wasi_oflags_t oflags, __wasi_fdflags_t fd_flags, + __wasi_lookupflags_t lookup_flags, + wasi_libc_file_access_mode access_mode) +{ + int mode = 0; + + // Convert open flags. + if ((oflags & __WASI_O_CREAT) != 0) { + mode |= FS_O_CREATE; + } + if (((oflags & __WASI_O_EXCL) != 0) || ((oflags & __WASI_O_TRUNC) != 0) + || ((oflags & __WASI_O_DIRECTORY) != 0)) { + /* Zephyr is not POSIX no equivalent for these flags */ + /* __WASI_O_DIRECTORY: Open shouldn't handle directories */ + // TODO: log warning + } + + // Convert file descriptor flags. + if ((fd_flags & __WASI_FDFLAG_APPEND) != 0) { + mode |= FS_O_APPEND; + } + if (((fd_flags & __WASI_FDFLAG_DSYNC) != 0) + || ((fd_flags & __WASI_FDFLAG_RSYNC) != 0) + || ((fd_flags & __WASI_FDFLAG_SYNC) != 0) + || ((fd_flags & __WASI_FDFLAG_NONBLOCK) != 0)) { + /* Zephyr is not POSIX no equivalent for these flags */ + // TODO: log warning + } + + // Convert lookup flag. + if ((lookup_flags & __WASI_LOOKUP_SYMLINK_FOLLOW) == 0) { + /* Zephyr is not POSIX no equivalent for these flags */ + // TODO: log warning + return __WASI_ENOTSUP; + } + + // Convert access mode. + switch (access_mode) { + case WASI_LIBC_ACCESS_MODE_READ_WRITE: + mode |= FS_O_RDWR; + break; + case WASI_LIBC_ACCESS_MODE_READ_ONLY: + mode |= FS_O_READ; + break; + case WASI_LIBC_ACCESS_MODE_WRITE_ONLY: + mode |= FS_O_WRITE; + break; + default: + // TODO: log warning + break; + } + return mode; +} + +__wasi_errno_t +os_openat(os_file_handle handle, const char *path, __wasi_oflags_t oflags, + __wasi_fdflags_t fd_flags, __wasi_lookupflags_t lookup_flags, + wasi_libc_file_access_mode access_mode, os_file_handle *out) +{ + /* + * `handle` will be unused because zephyr doesn't expose an openat + * function and don't seem to have the concept of relative path. + * We fill `out` with a new file descriptor. + */ + int rc, index; + struct zephyr_fs_desc *ptr = NULL; + char abs_path[MAX_FILE_NAME + 1]; + + *out = BH_MALLOC(sizeof(struct zephyr_handle)); + if (*out == NULL) { + return __WASI_ENOMEM; + } + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + // Treat directories as a special case + bool is_dir = oflags & __WASI_O_DIRECTORY; + + ptr = zephyr_fs_alloc_obj(is_dir, abs_path, &index); + if (!ptr && (index < 0)) { + BH_FREE(*out); + return __WASI_EMFILE; + } + + if (is_dir) { + fs_dir_t_init(&ptr->dir); + // fs_opendir() is called in libc later - don't call here + } + else { + // Is a file + int zmode = + wasi_flags_to_zephyr(oflags, fd_flags, lookup_flags, access_mode); + fs_file_t_init(&ptr->file); + rc = fs_open(&ptr->file, abs_path, zmode); + + if (rc < 0) { + zephyr_fs_free_obj(ptr); + BH_FREE(*out); + return convert_errno(-rc); + } + } + + (*out)->fd = index; + (*out)->is_sock = false; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_file_get_access_mode(os_file_handle handle, + wasi_libc_file_access_mode *access_mode) +{ + + if (handle->fd == STDIN_FILENO) { + *access_mode = WASI_LIBC_ACCESS_MODE_READ_ONLY; + return __WASI_ESUCCESS; + } + else if (handle->fd == STDOUT_FILENO || handle->fd == STDERR_FILENO) { + *access_mode = WASI_LIBC_ACCESS_MODE_WRITE_ONLY; + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + + if (handle->is_sock) { + // for socket we can use the following code + // TODO: Need to determine better logic + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + return __WASI_ESUCCESS; + } + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + if (ptr->is_dir) { + // DSK: is this actually the correct mode for a dir? + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + return __WASI_ESUCCESS; + } + + if ((ptr->file.flags & FS_O_RDWR) != 0) { + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + } + else if ((ptr->file.flags & FS_O_READ) != 0) { + *access_mode = WASI_LIBC_ACCESS_MODE_READ_ONLY; + } + else if ((ptr->file.flags & FS_O_WRITE) != 0) { + *access_mode = WASI_LIBC_ACCESS_MODE_WRITE_ONLY; + } + else { + // we return read/write by default + *access_mode = WASI_LIBC_ACCESS_MODE_READ_WRITE; + } + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_close(os_file_handle handle, bool is_stdio) +{ + int rc; + struct zephyr_fs_desc *ptr = NULL; + + if (is_stdio) + return __WASI_ESUCCESS; + + if (handle->is_sock) { + rc = zsock_close(handle->fd); + } + // Handle is assumed to be a file descriptor + else { + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + rc = ptr->is_dir ? fs_closedir(&ptr->dir) : fs_close(&ptr->file); + zephyr_fs_free_obj(ptr); // free in any case. + } + + BH_FREE(handle); + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_preadv(os_file_handle handle, const struct __wasi_iovec_t *iov, int iovcnt, + __wasi_filesize_t offset, size_t *nread) +{ + if (handle->fd == STDIN_FILENO) { + return __WASI_ENOSYS; + } + + struct zephyr_fs_desc *ptr = NULL; + int rc; + ssize_t total_read = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Seek to the offset + rc = fs_seek(&ptr->file, offset, FS_SEEK_SET); + if (rc < 0) { + return convert_errno(-rc); + } + + // Read data into each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_read = fs_read(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_read < 0) { + return convert_errno(-bytes_read); + } + + total_read += bytes_read; + + // If we read less than we asked for, stop reading + if (bytes_read < iov[i].buf_len) { + break; + } + } + + *nread = total_read; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_pwritev(os_file_handle handle, const struct __wasi_ciovec_t *iov, int iovcnt, + __wasi_filesize_t offset, size_t *nwritten) +{ + struct zephyr_fs_desc *ptr = NULL; + ssize_t total_written = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Seek to the offset + int rc = fs_seek(&ptr->file, offset, FS_SEEK_SET); + if (rc < 0) { + return convert_errno(-rc); + } + + // Write data from each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_written = + fs_write(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_written < 0) { + return convert_errno(-bytes_written); + } + + total_written += bytes_written; + + // If we wrote less than we asked for, stop writing + if (bytes_written < iov[i].buf_len) { + break; + } + } + + *nwritten = total_written; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_readv(os_file_handle handle, const struct __wasi_iovec_t *iov, int iovcnt, + size_t *nread) +{ + struct zephyr_fs_desc *ptr = NULL; + ssize_t total_read = 0; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Read data into each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_read = fs_read(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_read < 0) { + // If an error occurred, return it + return convert_errno(-bytes_read); + } + + total_read += bytes_read; + + // If we read less than we asked for, stop reading + if (bytes_read < iov[i].buf_len) { + break; + } + } + + *nread = total_read; + + return __WASI_ESUCCESS; +} + +/* With wasi-libc we need to redirect write on stdout/err to printf */ +// TODO: handle write on stdin +__wasi_errno_t +os_writev(os_file_handle handle, const struct __wasi_ciovec_t *iov, int iovcnt, + size_t *nwritten) +{ + ssize_t total_written = 0; + + if (os_is_virtual_fd(handle->fd)) { + FILE *fd = (handle->fd == STDERR_FILENO) ? stderr : stdout; + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_written = fwrite(iov[i].buf, 1, iov[i].buf_len, fd); + if (bytes_written < 0) + return convert_errno(-bytes_written); + total_written += bytes_written; + } + + *nwritten = total_written; + return __WASI_ESUCCESS; + } + + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // Write data from each buffer + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_written = + fs_write(&ptr->file, iov[i].buf, iov[i].buf_len); + if (bytes_written < 0) { + return convert_errno(-bytes_written); + } + + total_written += bytes_written; + + // If we wrote less than we asked for, stop writing + if (bytes_written < iov[i].buf_len) { + break; + } + } + + *nwritten = total_written; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_fallocate(os_file_handle handle, __wasi_filesize_t offset, + __wasi_filesize_t length) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_ftruncate(os_file_handle handle, __wasi_filesize_t size) +{ + + if (os_is_virtual_fd(handle->fd)) { + return __WASI_EINVAL; + } + + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + int rc = fs_truncate(&ptr->file, (off_t)size); + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_futimens(os_file_handle handle, __wasi_timestamp_t access_time, + __wasi_timestamp_t modification_time, __wasi_fstflags_t fstflags) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_utimensat(os_file_handle handle, const char *path, + __wasi_timestamp_t access_time, + __wasi_timestamp_t modification_time, __wasi_fstflags_t fstflags, + __wasi_lookupflags_t lookup_flags) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_readlinkat(os_file_handle handle, const char *path, char *buf, + size_t bufsize, size_t *nread) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_linkat(os_file_handle from_handle, const char *from_path, + os_file_handle to_handle, const char *to_path, + __wasi_lookupflags_t lookup_flags) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_symlinkat(const char *old_path, os_file_handle handle, const char *new_path) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_mkdirat(os_file_handle handle, const char *path) +{ + struct zephyr_fs_desc *ptr = NULL; + int index, rc; + char abs_path[MAX_FILE_NAME + 1]; + + if (handle == NULL) { + return __WASI_EINVAL; // Or another appropriate error code + } + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + rc = fs_mkdir(abs_path); + if (rc < 0) { + return convert_errno(-rc); + } + + ptr = zephyr_fs_alloc_obj(true, abs_path, &index); + if (!ptr) { + fs_unlink(abs_path); + return __WASI_EMFILE; + } + fs_dir_t_init(&ptr->dir); + + handle->fd = index; + handle->is_sock = false; + + return __WASI_ESUCCESS; +} + +// DSK: Somewhere along the WASI libc implementation path, the knowledge +// was lost that `old_handle` and `new_handle` refer to directories that +// contain the files to be renamed, rather than the file fds themselves: +// +// __wasilibc_nocwd_renameat(old_dirfd, old_relative_path, +// new_dirfd, new_relative_path); +// +// Therefore we won't mess with the supplied fd's, and work only off +// of the supplied paths. Note: this will change when more than one +// pre-opened dir is supported in the future. +__wasi_errno_t +os_renameat(os_file_handle old_handle, const char *old_path, + os_file_handle new_handle, const char *new_path) +{ + // directories, safe to ignore + (void)old_handle; + (void)new_handle; + + char abs_old_path[MAX_FILE_NAME + 1]; + char abs_new_path[MAX_FILE_NAME + 1]; + + if (!build_absolute_path(abs_old_path, sizeof(abs_old_path), old_path)) { + return __WASI_ENOMEM; + } + + if (!build_absolute_path(abs_new_path, sizeof(abs_new_path), new_path)) { + return __WASI_ENOMEM; + } + + // Attempt to perform the rename + int rc = fs_rename(abs_old_path, abs_new_path); + if (rc < 0) { + return convert_errno(-rc); + } + + // If there is an allocated fd in our table, update the descriptor table + // entry DSK: better approach here? + k_mutex_lock(&desc_array_mutex, K_FOREVER); + for (int i = 0; i < CONFIG_WASI_MAX_OPEN_FILES; i++) { + struct zephyr_fs_desc *ptr = &desc_array[i]; + if (ptr->used && ptr->path && strcmp(ptr->path, abs_old_path) == 0) { + char *new_path_copy = bh_strdup(new_path); + if (new_path_copy != NULL) { + BH_FREE(ptr->path); + ptr->path = new_path_copy; + } + break; // Only one descriptor should match + } + } + k_mutex_unlock(&desc_array_mutex); + + return __WASI_ESUCCESS; +} + +// DSK: Same thing as renameat: `handle` refers to the containing directory, +// not the file handle to unlink. We ignore the handle and use the path +// exclusively. +// +// TODO: is there anything we need to do in case is_dir=true? +__wasi_errno_t +os_unlinkat(os_file_handle handle, const char *path, bool is_dir) +{ + (void)handle; + + char abs_path[MAX_FILE_NAME + 1]; + + if (!build_absolute_path(abs_path, sizeof(abs_path), path)) { + return __WASI_ENOMEM; + } + + int rc = fs_unlink(abs_path); + if (rc < 0) { + return convert_errno(-rc); + } + + // Search for any active descriptor referencing this path and free it. + k_mutex_lock(&desc_array_mutex, K_FOREVER); + for (int i = 0; i < CONFIG_WASI_MAX_OPEN_FILES; i++) { + struct zephyr_fs_desc *ptr = &desc_array[i]; + if (ptr->used && ptr->path && strcmp(ptr->path, abs_path) == 0) { + zephyr_fs_free_obj(ptr); + break; + } + } + k_mutex_unlock(&desc_array_mutex); + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_lseek(os_file_handle handle, __wasi_filedelta_t offset, + __wasi_whence_t whence, __wasi_filesize_t *new_offset) +{ + + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESPIPE; // Seeking not supported on character streams + } + + struct zephyr_fs_desc *ptr = NULL; + int zwhence; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + + // They have the same value but this is more explicit + switch (whence) { + case __WASI_WHENCE_SET: + zwhence = FS_SEEK_SET; + break; + case __WASI_WHENCE_CUR: + zwhence = FS_SEEK_CUR; + break; + case __WASI_WHENCE_END: + zwhence = FS_SEEK_END; + break; + default: + return __WASI_EINVAL; + } + + off_t rc = fs_seek(&ptr->file, (off_t)offset, zwhence); + if (rc < 0) { + return convert_errno(-rc); + } + + *new_offset = (__wasi_filesize_t)rc; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_fadvise(os_file_handle handle, __wasi_filesize_t offset, + __wasi_filesize_t length, __wasi_advice_t advice) +{ + return __WASI_ENOSYS; +} + +__wasi_errno_t +os_isatty(os_file_handle handle) +{ + if (os_is_virtual_fd(handle->fd)) { + return __WASI_ESUCCESS; + } + + return __WASI_ENOTTY; +} + +os_file_handle +os_convert_stdin_handle(os_raw_file_handle raw_stdin) +{ + os_file_handle handle = BH_MALLOC(sizeof(struct zephyr_handle)); + if (!handle) + return NULL; + + handle->fd = STDIN_FILENO; + handle->is_sock = false; + return handle; +} + +os_file_handle +os_convert_stdout_handle(os_raw_file_handle raw_stdout) +{ + os_file_handle handle = BH_MALLOC(sizeof(struct zephyr_handle)); + if (!handle) + return NULL; + + handle->fd = STDOUT_FILENO; + handle->is_sock = false; + return handle; +} + +os_file_handle +os_convert_stderr_handle(os_raw_file_handle raw_stderr) +{ + os_file_handle handle = BH_MALLOC(sizeof(struct zephyr_handle)); + if (!handle) + return NULL; + + handle->fd = STDERR_FILENO; + handle->is_sock = false; + return handle; +} + +__wasi_errno_t +os_fdopendir(os_file_handle handle, os_dir_stream *dir_stream) +{ + /* Here we assume that either mdkdir or preopendir was called + * before otherwise function will fail. + */ + struct zephyr_fs_desc *ptr = NULL; + + GET_FILE_SYSTEM_DESCRIPTOR(handle->fd, ptr); + if (!ptr->is_dir) { + return __WASI_ENOTDIR; + } + + int rc = fs_opendir(&ptr->dir, ptr->path); + if (rc < 0) { + return convert_errno(-rc); + } + + /* we store the fd in the `os_dir_stream` to use other function */ + *dir_stream = handle->fd; + + return __WASI_ESUCCESS; +} + +// DSK: simple open and close to rewind index. +__wasi_errno_t +os_rewinddir(os_dir_stream dir_stream) +{ + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + + if (!ptr->is_dir) + return __WASI_ENOTDIR; + + int rc = fs_closedir(&ptr->dir); // Close current stream + if (rc < 0) + return convert_errno(-rc); + + rc = fs_opendir(&ptr->dir, ptr->path); // Reopen from start + if (rc < 0) + return convert_errno(-rc); + + ptr->dir_index = 0; // Reset virtual position tracker + return __WASI_ESUCCESS; +} + +// DSK: start from 0 and linear seek since there's no cookies in the zephyr fs +// TODO: duplicated code with rewinddir +__wasi_errno_t +os_seekdir(os_dir_stream dir_stream, __wasi_dircookie_t position) +{ + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + + if (!ptr->is_dir) + return __WASI_ENOTDIR; + + int rc = fs_closedir(&ptr->dir); + if (rc < 0) + return convert_errno(-rc); + + rc = fs_opendir(&ptr->dir, ptr->path); + if (rc < 0) + return convert_errno(-rc); + + // Emulate seek by re-reading entries up to 'position' + struct fs_dirent tmp; + for (__wasi_dircookie_t i = 0; i < position; i++) { + rc = fs_readdir(&ptr->dir, &tmp); + if (rc < 0) + return convert_errno(-rc); + if (tmp.name[0] == '\0') + break; // End of directory + } + + ptr->dir_index = position; + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_readdir(os_dir_stream dir_stream, __wasi_dirent_t *entry, + const char **d_name) +{ + struct fs_dirent fs_entry; + struct zephyr_fs_desc *ptr = NULL; + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + if (!ptr->is_dir) { + return __WASI_ENOTDIR; + } + + int rc = fs_readdir(&ptr->dir, &fs_entry); + if (rc < 0) { + return convert_errno(-rc); + } + + if (fs_entry.name[0] == '\0') { + // DSK: the caller expects the name buffer to be null + // when we've reached the end of the directory. + *d_name = NULL; + return __WASI_ESUCCESS; + } + + // DSK: emulated increasing value for rewinddir and seekdir + entry->d_next = ++ptr->dir_index; + + // DSK: A hack to get readdir working. This needs to be non-zero along with + // st_ino for the libc side of readdir to work correctly. + entry->d_ino = 1 + ptr->dir_index; + + entry->d_namlen = strlen(fs_entry.name); + entry->d_type = fs_entry.type == FS_DIR_ENTRY_DIR + ? __WASI_FILETYPE_DIRECTORY + : __WASI_FILETYPE_REGULAR_FILE; + + // DSK: name exists in fs_entry and we need to return it + static char name_buf[MAX_FILE_NAME + 1]; + strncpy(name_buf, fs_entry.name, MAX_FILE_NAME); + name_buf[MAX_FILE_NAME] = '\0'; + *d_name = name_buf; + + return __WASI_ESUCCESS; +} + +__wasi_errno_t +os_closedir(os_dir_stream dir_stream) +{ + struct zephyr_fs_desc *ptr = NULL; + + GET_FILE_SYSTEM_DESCRIPTOR(dir_stream, ptr); + if (!ptr->is_dir) { + return __WASI_ENOTDIR; + } + + int rc = fs_closedir(&ptr->dir); + zephyr_fs_free_obj(ptr); // free in any case. + if (rc < 0) { + return convert_errno(-rc); + } + + return __WASI_ESUCCESS; +} + +os_dir_stream +os_get_invalid_dir_stream() +{ + return OS_DIR_STREAM_INVALID; +} + +bool +os_is_dir_stream_valid(os_dir_stream *dir_stream) +{ + // DSK: this probably needs a check... + return false; +} + +bool +os_is_handle_valid(os_file_handle *handle) +{ + if (handle == NULL || *handle == NULL) { + return false; + } + return (*handle)->fd > -1; +} + +char * +os_realpath(const char *path, char *resolved_path) +{ + /* In fact we could implement a path resolving method, because every paths + * are at one point put into memory. + * We could then maintain a 'tree' to represent the file system. + * --> The file system root is easily accessable with: + * * (fs_dir_t) dir.mp->mnt_point + * * (fs_file_t) file.mp->mnt_point + * But we will just use absolute path for now. + */ + if ((!path) || (strlen(path) > PATH_MAX)) { + // Invalid input, path has to be valid and less than PATH_MAX + return NULL; + } + + return strncpy(resolved_path, path, PATH_MAX); +} + +bool +os_compare_file_handle(os_file_handle handle1, os_file_handle handle2) +{ + return handle1->fd == handle2->fd && handle1->is_sock == handle2->is_sock; +} + +bool +os_is_stdin_handle(os_file_handle handle) +{ + return (handle == (os_file_handle)stdin); +} + +bool +os_is_stdout_handle(os_file_handle handle) +{ + return (handle == (os_file_handle)stdout); +} + +bool +os_is_stderr_handle(os_file_handle handle) +{ + return (handle == (os_file_handle)stderr); +} \ No newline at end of file diff --git a/core/shared/platform/zephyr/zephyr_socket.c b/core/shared/platform/zephyr/zephyr_socket.c new file mode 100644 index 0000000000..6d108623e3 --- /dev/null +++ b/core/shared/platform/zephyr/zephyr_socket.c @@ -0,0 +1,1062 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "platform_api_extension.h" +#include "platform_api_vmcore.h" + +#include +#include +#include + +#include +#include + +#include "libc_errno.h" +#include +#include + +// Static functions +static bool +textual_addr_to_sockaddr(const char *textual, int port, struct sockaddr *out, + socklen_t *out_len) +{ + struct sockaddr_in *v4; +#ifdef IPPROTO_IPV6 + struct sockaddr_in *v6; +#endif + + assert(textual); + + v4 = (struct sockaddr_in *)out; + if (zsock_inet_pton(AF_INET, textual, &v4->sin_addr.s_addr) == 1) { + v4->sin_family = AF_INET; + v4->sin_port = htons(port); + *out_len = sizeof(struct sockaddr_in); + return true; + } + +#ifdef IPPROTO_IPV6 + v6 = (struct sockaddr_in *)out; + if (zsock_inet_pton(AF_INET6, textual, &v6->sin6_addr.s6_addr) == 1) { + v6->sin6_family = AF_INET6; + v6->sin6_port = htons(port); + *out_len = sizeof(struct sockaddr_in); + return true; + } +#endif + + return false; +} + +static int +sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr, + bh_sockaddr_t *bh_sockaddr) +{ + switch (sockaddr->sa_family) { + case AF_INET: + { + struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr; + + bh_sockaddr->port = ntohs(addr->sin_port); + bh_sockaddr->addr_buffer.ipv4 = ntohl(addr->sin_addr.s_addr); + bh_sockaddr->is_ipv4 = true; + return BHT_OK; + } +#ifdef IPPROTO_IPV6 + case AF_INET6: + { + struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr; + size_t i; + + bh_sockaddr->port = ntohs(addr->sin6_port); + + for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6) + / sizeof(bh_sockaddr->addr_buffer.ipv6[0]); + i++) { + uint16 part_addr = addr->sin6_addr.s6_addr[i * 2] + | (addr->sin6_addr.s6_addr[i * 2 + 1] << 8); + bh_sockaddr->addr_buffer.ipv6[i] = ntohs(part_addr); + } + + bh_sockaddr->is_ipv4 = false; + return BHT_OK; + } +#endif + default: + errno = EAFNOSUPPORT; + return BHT_ERROR; + } +} + +static void +bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr, + struct sockaddr_storage *sockaddr, socklen_t *socklen) +{ + if (bh_sockaddr->is_ipv4) { + struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr; + addr->sin_port = htons(bh_sockaddr->port); + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_buffer.ipv4); + *socklen = sizeof(*addr); + } +#ifdef IPPROTO_IPV6 + else { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *)sockaddr; + size_t i; + addr->sin6_port = htons(bh_sockaddr->port); + addr->sin6_family = AF_INET6; + + for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6) + / sizeof(bh_sockaddr->addr_buffer.ipv6[0]); + i++) { + uint16 part_addr = htons(bh_sockaddr->addr_buffer.ipv6[i]); + addr->sin6_addr.s6_addr[i * 2] = 0xff & part_addr; + addr->sin6_addr.s6_addr[i * 2 + 1] = (0xff00 & part_addr) >> 8; + } + + *socklen = sizeof(*addr); + } +#endif +} + +static int +getaddrinfo_error_to_errno(int error) +{ + switch (error) { + case DNS_EAI_AGAIN: + return EAGAIN; + case DNS_EAI_FAIL: + return EFAULT; + case DNS_EAI_MEMORY: + return ENOMEM; + case DNS_EAI_SYSTEM: + return errno; + default: + return EINVAL; + } +} + +static int +is_addrinfo_supported(struct zsock_addrinfo *info) +{ + return + // Allow only IPv4 and IPv6 + (info->ai_family == AF_INET || info->ai_family == AF_INET6) + // Allow only UDP and TCP + && (info->ai_socktype == SOCK_DGRAM || info->ai_socktype == SOCK_STREAM) + && (info->ai_protocol == IPPROTO_TCP + || info->ai_protocol == IPPROTO_UDP); +} + +static int +os_socket_setbooloption(bh_socket_t socket, int level, int optname, + bool is_enabled) +{ + int option = (int)is_enabled; + + if (zsock_setsockopt(socket->fd, level, optname, &option, sizeof(option)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +static int +os_socket_getbooloption(bh_socket_t socket, int level, int optname, + bool *is_enabled) +{ + assert(is_enabled); + + int optval; + socklen_t optval_size = sizeof(optval); + + if (zsock_setsockopt(socket->fd, level, optname, &optval, optval_size) + != 0) { + return BHT_ERROR; + } + *is_enabled = (bool)optval; + return BHT_OK; +} + +// Platform API implementation +int +os_socket_create(bh_socket_t *sock, bool is_ipv4, bool is_tcp) +{ + int af = is_ipv4 ? AF_INET : AF_INET6; + // now socket is a struct try *(sock)->fd + + *(sock) = BH_MALLOC(sizeof(zephyr_handle)); + + if (!sock) { + return BHT_ERROR; + } + + if (is_tcp) { + (*sock)->fd = zsock_socket(af, SOCK_STREAM, IPPROTO_TCP); + } + else { + (*sock)->fd = + zsock_socket(af, SOCK_DGRAM, IPPROTO_UDP); // IPPROTO_UDP or 0 + } + + (*sock)->is_sock = true; + + if ((*sock)->fd == -1) { + BH_FREE(*sock); + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_bind(bh_socket_t socket, const char *host, int *port) +{ + struct sockaddr_storage addr = { 0 }; + socklen_t socklen; + int ret; + + assert(host); + assert(port); + + if (!textual_addr_to_sockaddr(host, *port, (struct sockaddr *)&addr, + &socklen)) { + return BHT_ERROR; + } + + // F_SETF_SETFD and FD_CLOEXEC are not defined in zephyr. + // SO_LINGER: Socket lingers on close (ignored, for compatibility) + + ret = zsock_bind(socket->fd, (struct sockaddr *)&addr, socklen); + if (ret < 0) { + return BHT_ERROR; + } + + socklen = sizeof(addr); + if (zsock_getsockname(socket->fd, (void *)&addr, &socklen) == -1) { + return BHT_ERROR; + } + + if (addr.ss_family == AF_INET) { // addr.sin_family + *port = ntohs(((struct sockaddr_in *)&addr)->sin_port); + } + else { +#ifdef IPPROTO_IPV6 + *port = ntohs(((struct sockaddr_in *)&addr)->sin6_port); +#else + return BHT_ERROR; +#endif + } + + return BHT_OK; +} + +int +os_socket_settimeout(bh_socket_t socket, uint64 timeout_us) +{ + struct timeval timeout = { 0 }; + + timeout.tv_sec = timeout_us / 1000000; + timeout.tv_usec = timeout_us % 1000000; + + return zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, + sizeof(timeout)); +} + +int +os_socket_listen(bh_socket_t socket, int max_client) +{ + return zsock_listen(socket->fd, max_client) != 0 ? BHT_ERROR : BHT_OK; +} + +int +os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr, + unsigned int *addrlen) +{ + *sock = BH_MALLOC(sizeof(zephyr_handle)); + if (!sock) { + return BHT_ERROR; + } + + (*sock)->fd = zsock_accept(server_sock->fd, addr, addrlen); + + if ((*sock)->fd < 0) { + BH_FREE(*sock); + return BHT_ERROR; + } + + (*sock)->is_sock = true; + + return BHT_OK; +} + +int +os_socket_connect(bh_socket_t socket, const char *addr, int port) +{ + struct sockaddr_storage addr_in = { 0 }; + socklen_t socklen; + int ret; + + assert(addr); + + if (!textual_addr_to_sockaddr(addr, port, (struct sockaddr *)&addr_in, + &socklen)) { + return BHT_ERROR; + } + + ret = zsock_connect(socket->fd, (struct sockaddr *)&addr_in, socklen); + if (ret < 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_recv(bh_socket_t socket, void *buf, unsigned int len) +{ + return zsock_recv(socket->fd, buf, len, 0); +} + +int +os_socket_recv_from(bh_socket_t socket, void *buf, unsigned int len, int flags, + bh_sockaddr_t *src_addr) +{ + struct sockaddr_storage sock_addr = { 0 }; + socklen_t socklen = sizeof(sock_addr); + int ret; + + ret = zsock_recvfrom(socket->fd, buf, len, flags, + (struct sockaddr *)&sock_addr, &socklen); + + if (ret < 0) { + return BHT_ERROR; + } + + if (src_addr && socklen > 0) { + // zsock_recvfrom doesn't seem to set `addr->sa_family`, + // so we set it manually. + ((struct sockaddr *)&sock_addr)->sa_family = + src_addr->is_ipv4 == true ? AF_INET : AF_INET6; + + if (sockaddr_to_bh_sockaddr((struct sockaddr *)&sock_addr, src_addr) + == BHT_ERROR) { + return -1; + } + } + else if (src_addr) { + memset(src_addr, 0, sizeof(*src_addr)); + } + + return ret; +} + +int +os_socket_send(bh_socket_t socket, const void *buf, unsigned int len) +{ + return zsock_send(socket->fd, buf, len, 0); +} + +int +os_socket_send_to(bh_socket_t socket, const void *buf, unsigned int len, + int flags, const bh_sockaddr_t *dest_addr) +{ + struct sockaddr_storage addr = { 0 }; + socklen_t socklen; + + (void)bh_sockaddr_to_sockaddr(dest_addr, &addr, &socklen); + + return zsock_sendto(socket->fd, buf, len, flags, (struct sockaddr *)&addr, + socklen); +} + +int +os_socket_close(bh_socket_t socket) +{ + zsock_close(socket->fd); + + BH_FREE(socket); + + return BHT_OK; +} + +__wasi_errno_t +os_socket_shutdown(bh_socket_t socket) +{ + if (zsock_shutdown(socket->fd, ZSOCK_SHUT_RDWR) == -1) { + return convert_errno(errno); + } + return __WASI_ESUCCESS; +} + +int +os_socket_inet_network(bool is_ipv4, const char *cp, bh_ip_addr_buffer_t *out) +{ + if (!cp) + return BHT_ERROR; + + if (is_ipv4) { + if (zsock_inet_pton(AF_INET, cp, &out->ipv4) != 1) { + return BHT_ERROR; + } + /* Note: ntohl(INADDR_NONE) == INADDR_NONE */ + out->ipv4 = ntohl(out->ipv4); + } + else { +#ifdef IPPROTO_IPV6 + if (zsock_inet_pton(AF_INET6, cp, out->ipv6) != 1) { + return BHT_ERROR; + } + for (int i = 0; i < 8; i++) { + out->ipv6[i] = ntohs(out->ipv6[i]); + } +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif + } + + return BHT_OK; +} + +int +os_socket_addr_resolve(const char *host, const char *service, + uint8_t *hint_is_tcp, uint8_t *hint_is_ipv4, + bh_addr_info_t *addr_info, size_t addr_info_size, + size_t *max_info_size) +{ + struct zsock_addrinfo hints = { 0 }, *res, *result; + int hints_enabled = hint_is_tcp || hint_is_ipv4; + int ret; + size_t pos = 0; + + if (hints_enabled) { + if (hint_is_ipv4) { + hints.ai_family = *hint_is_ipv4 ? AF_INET : AF_INET6; + } + if (hint_is_tcp) { + hints.ai_socktype = *hint_is_tcp ? SOCK_STREAM : SOCK_DGRAM; + } + } + + ret = zsock_getaddrinfo(host, strlen(service) == 0 ? NULL : service, + hints_enabled ? &hints : NULL, &result); + if (ret != BHT_OK) { + errno = getaddrinfo_error_to_errno(ret); + return BHT_ERROR; + } + + res = result; + + while (res) { + if (addr_info_size > pos) { + if (!is_addrinfo_supported(res)) { + res = res->ai_next; + continue; + } + + ret = + sockaddr_to_bh_sockaddr(res->ai_addr, &addr_info[pos].sockaddr); + + if (ret == BHT_ERROR) { + zsock_freeaddrinfo(result); + return BHT_ERROR; + } + + addr_info[pos].is_tcp = res->ai_socktype == SOCK_STREAM; + } + + pos++; + res = res->ai_next; + } + + *max_info_size = pos; + zsock_freeaddrinfo(result); + + return BHT_OK; +} + +int +os_socket_addr_local(bh_socket_t socket, bh_sockaddr_t *sockaddr) +{ + struct sockaddr_storage addr_storage = { 0 }; + socklen_t addr_len = sizeof(addr_storage); + int ret; + + ret = zsock_getsockname(socket->fd, (struct sockaddr *)&addr_storage, + &addr_len); + + if (ret != BHT_OK) { + return BHT_ERROR; + } + + return sockaddr_to_bh_sockaddr((struct sockaddr *)&addr_storage, sockaddr); +} + +int +os_socket_addr_remote(bh_socket_t socket, bh_sockaddr_t *sockaddr) +{ + struct sockaddr_storage addr_storage = { 0 }; + socklen_t addr_len = sizeof(addr_storage); + int ret; + + ret = zsock_getpeername(socket->fd, (struct sockaddr *)&addr_storage, + &addr_len); + + if (ret != BHT_OK) { + return BHT_ERROR; + } + + return sockaddr_to_bh_sockaddr((struct sockaddr *)&addr_storage, sockaddr); +} + +int +os_socket_set_send_buf_size(bh_socket_t socket, size_t bufsiz) +{ + int buf_size_int = (int)bufsiz; + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDBUF, &buf_size_int, + sizeof(buf_size_int)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_send_buf_size(bh_socket_t socket, size_t *bufsiz) +{ + assert(bufsiz); + + int buf_size_int; + socklen_t bufsiz_len = sizeof(buf_size_int); + + if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_SNDBUF, &buf_size_int, + &bufsiz_len) + != 0) { + return BHT_ERROR; + } + + *bufsiz = (size_t)buf_size_int; + return BHT_OK; +} + +int +os_socket_set_recv_buf_size(bh_socket_t socket, size_t bufsiz) +{ + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVBUF, &bufsiz, + sizeof(bufsiz)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_recv_buf_size(bh_socket_t socket, size_t *bufsiz) +{ + assert(bufsiz); + + int buf_size_int; + socklen_t bufsiz_len = sizeof(buf_size_int); + + if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_RCVBUF, &buf_size_int, + &bufsiz_len) + != 0) { + return BHT_ERROR; + } + *bufsiz = (size_t)buf_size_int; + + return BHT_OK; +} + +int +os_socket_set_keep_alive(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_KEEPALIVE, + is_enabled); +} + +int +os_socket_get_keep_alive(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_KEEPALIVE, + is_enabled); +} + +int +os_socket_set_send_timeout(bh_socket_t socket, uint64 timeout_us) +{ + struct timeval tv; + tv.tv_sec = timeout_us / 1000000UL; + tv.tv_usec = timeout_us % 1000000UL; + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) + != 0) { + return BHT_ERROR; + } + return BHT_OK; +} + +int +os_socket_get_send_timeout(bh_socket_t socket, uint64 *timeout_us) +{ + struct timeval tv; + socklen_t tv_len = sizeof(tv); + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, tv_len) + != 0) { + return BHT_ERROR; + } + *timeout_us = (tv.tv_sec * 1000000UL) + tv.tv_usec; + + return BHT_OK; +} + +int +os_socket_set_recv_timeout(bh_socket_t socket, uint64 timeout_us) +{ + struct timeval tv; + tv.tv_sec = timeout_us / 1000000UL; + tv.tv_usec = timeout_us % 1000000UL; + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_recv_timeout(bh_socket_t socket, uint64 *timeout_us) +{ + struct timeval tv; + socklen_t tv_len = sizeof(tv); + + if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, tv_len) + != 0) { + return BHT_ERROR; + } + *timeout_us = (tv.tv_sec * 1000000UL) + tv.tv_usec; + + return BHT_OK; +} + +int +os_socket_set_reuse_addr(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_REUSEADDR, + is_enabled); +} + +int +os_socket_get_reuse_addr(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_REUSEADDR, + is_enabled); +} + +int +os_socket_set_reuse_port(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_REUSEPORT, + is_enabled); +} + +int +os_socket_get_reuse_port(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_REUSEPORT, + is_enabled); +} + +// SO_LINGER Socket lingers on close (ignored, for compatibility) +int +os_socket_set_linger(bh_socket_t socket, bool is_enabled, int linger_s) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_linger(bh_socket_t socket, bool *is_enabled, int *linger_s) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +// TCP_NODELAY Disable TCP buffering (ignored, for compatibility) +int +os_socket_set_tcp_no_delay(bh_socket_t socket, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_tcp_no_delay(bh_socket_t socket, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_tcp_quick_ack(bh_socket_t socket, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_tcp_quick_ack(bh_socket_t socket, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_tcp_keep_idle(bh_socket_t socket, uint32_t time_s) +{ + int time_s_int = (int)time_s; + +#ifdef TCP_KEEPIDLE + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int, + sizeof(time_s_int)) + != 0) { + return BHT_ERROR; + } + return BHT_OK; +#elif defined(TCP_KEEPALIVE) + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int, + sizeof(time_s_int)) + != 0) { + return BHT_ERROR; + } + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32_t *time_s) +{ + assert(time_s); + int time_s_int; + socklen_t time_s_len = sizeof(time_s_int); + +#ifdef TCP_KEEPIDLE + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int, + time_s_len) + != 0) { + return BHT_ERROR; + } + *time_s = (uint32)time_s_int; + + return BHT_OK; +#elif defined(TCP_KEEPALIVE) + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int, + time_s_len) + != 0) { + return BHT_ERROR; + } + *time_s = (uint32)time_s_int; + + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_set_tcp_keep_intvl(bh_socket_t socket, uint32_t time_s) +{ + int time_s_int = (int)time_s; + +#ifdef TCP_KEEPINTVL + if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPINTVL, &time_s_int, + sizeof(time_s_int)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_get_tcp_keep_intvl(bh_socket_t socket, uint32_t *time_s) +{ +#ifdef TCP_KEEPINTVL + if (!socket || !time_s || socket->fd < 0) { + errno = EINVAL; + return BHT_ERROR; + } + + int time_s_int; + socklen_t time_s_len = sizeof(time_s_int); + + if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPINTVL, &time_s_int, + &time_s_len) + != 0) { + return BHT_ERROR; + } + + if (time_s_int < 0) { + errno = EINVAL; + return BHT_ERROR; + } + + *time_s = (uint32_t)time_s_int; + + return BHT_OK; +#else + errno = ENOSYS; + + return BHT_ERROR; +#endif +} + +int +os_socket_set_tcp_fastopen_connect(bh_socket_t socket, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_tcp_fastopen_connect(bh_socket_t socket, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_get_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool *is_enabled) +{ + errno = ENOSYS; + + return BHT_ERROR; +} + +int +os_socket_set_ip_add_membership(bh_socket_t socket, + bh_ip_addr_buffer_t *imr_multiaddr, + uint32_t imr_interface, bool is_ipv6) +{ + assert(imr_multiaddr); + + if (is_ipv6) { +#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN) + struct ipv6_mreq mreq; + + for (int i = 0; i < 8; i++) { + ((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] = + imr_multiaddr->ipv6[i]; + } + mreq.ipv6mr_interface = imr_interface; + + if (setsockopt(socket->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, + sizeof(mreq)) + != 0) { + return BHT_ERROR; + } +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif + } + else { + struct ip_mreqn mreq; + mreq.imr_multiaddr.s_addr = imr_multiaddr->ipv4; + mreq.imr_address.s_addr = imr_interface; + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, + sizeof(mreq)) + != 0) { + return BHT_ERROR; + } + } + return BHT_OK; +} + +int +os_socket_set_ip_drop_membership(bh_socket_t socket, + bh_ip_addr_buffer_t *imr_multiaddr, + uint32_t imr_interface, bool is_ipv6) +{ + assert(imr_multiaddr); + + if (is_ipv6) { +#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN) + struct ipv6_mreq mreq; + + for (int i = 0; i < 8; i++) { + ((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] = + imr_multiaddr->ipv6[i]; + } + mreq.ipv6mr_interface = imr_interface; + + if (zsock_setsockopt(socket->fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, + &mreq, sizeof(mreq)) + != 0) { + return BHT_ERROR; + } +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif + } + else { + struct ip_mreqn mreq; + mreq.imr_multiaddr.s_addr = imr_multiaddr->ipv4; + mreq.imr_address.s_addr = imr_interface; + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, + sizeof(mreq)) + != 0) { + return BHT_ERROR; + } + } + return BHT_OK; +} + +int +os_socket_set_ip_ttl(bh_socket_t socket, uint8_t ttl_s) +{ + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_TTL, &ttl_s, sizeof(ttl_s)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_ip_ttl(bh_socket_t socket, uint8_t *ttl_s) +{ + socklen_t opt_len = sizeof(*ttl_s); + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s, + opt_len) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_set_ip_multicast_ttl(bh_socket_t socket, uint8_t ttl_s) +{ + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl_s, + sizeof(ttl_s)) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_get_ip_multicast_ttl(bh_socket_t socket, uint8_t *ttl_s) +{ + socklen_t opt_len = sizeof(*ttl_s); + + if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s, + opt_len) + != 0) { + return BHT_ERROR; + } + + return BHT_OK; +} + +int +os_socket_set_ipv6_only(bh_socket_t socket, bool is_enabled) +{ +#ifdef IPPROTO_IPV6 + return os_socket_setbooloption(socket, IPPROTO_IPV6, IPV6_V6ONLY, + is_enabled); +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif +} + +int +os_socket_get_ipv6_only(bh_socket_t socket, bool *is_enabled) +{ +#ifdef IPPROTO_IPV6 + return os_socket_getbooloption(socket, IPPROTO_IPV6, IPV6_V6ONLY, + is_enabled); +#else + errno = EAFNOSUPPORT; + return BHT_ERROR; +#endif +} + +int +os_socket_set_broadcast(bh_socket_t socket, bool is_enabled) +{ + return os_socket_setbooloption(socket, SOL_SOCKET, SO_BROADCAST, + is_enabled); +} + +int +os_socket_get_broadcast(bh_socket_t socket, bool *is_enabled) +{ + return os_socket_getbooloption(socket, SOL_SOCKET, SO_BROADCAST, + is_enabled); +} + +// Experimental : +int +os_ioctl(os_file_handle handle, int request, ...) +{ + return __WASI_ENOSYS; + // int ret = -1; + // va_list args; + + // va_start(args, request); + // ret = zsock_ioctl(handle->fd, request, args); + // va_end(args); + + // return ret; +} + +int +os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout) +{ + return zsock_poll(fds, nfs, timeout); +} \ No newline at end of file diff --git a/core/shared/platform/zephyr/zephyr_thread.c b/core/shared/platform/zephyr/zephyr_thread.c index 31aaad7a93..af864e417e 100644 --- a/core/shared/platform/zephyr/zephyr_thread.c +++ b/core/shared/platform/zephyr/zephyr_thread.c @@ -34,22 +34,22 @@ static K_THREAD_STACK_ARRAY_DEFINE(mpu_stacks, BH_ZEPHYR_MPU_STACK_COUNT, BH_ZEPHYR_MPU_STACK_SIZE); static bool mpu_stack_allocated[BH_ZEPHYR_MPU_STACK_COUNT]; -static mutex_t mpu_stack_lock; +static zmutex_t mpu_stack_lock; static char * mpu_stack_alloc() { int i; - mutex_lock(&mpu_stack_lock, K_FOREVER); + zmutex_lock(&mpu_stack_lock, K_FOREVER); for (i = 0; i < BH_ZEPHYR_MPU_STACK_COUNT; i++) { if (!mpu_stack_allocated[i]) { mpu_stack_allocated[i] = true; - mutex_unlock(&mpu_stack_lock); + zmutex_unlock(&mpu_stack_lock); return (char *)mpu_stacks[i]; } } - mutex_unlock(&mpu_stack_lock); + zmutex_unlock(&mpu_stack_lock); return NULL; } @@ -58,17 +58,17 @@ mpu_stack_free(char *stack) { int i; - mutex_lock(&mpu_stack_lock, K_FOREVER); + zmutex_lock(&mpu_stack_lock, K_FOREVER); for (i = 0; i < BH_ZEPHYR_MPU_STACK_COUNT; i++) { if ((char *)mpu_stacks[i] == stack) mpu_stack_allocated[i] = false; } - mutex_unlock(&mpu_stack_lock); + zmutex_unlock(&mpu_stack_lock); } #endif typedef struct os_thread_wait_node { - sem_t sem; + zsem_t sem; os_thread_wait_list next; } os_thread_wait_node; @@ -80,7 +80,7 @@ typedef struct os_thread_data { /* Jeff thread local root */ void *tlr; /* Lock for waiting list */ - mutex_t wait_list_lock; + zmutex_t wait_list_lock; /* Waiting list of other threads who are joining this thread */ os_thread_wait_list thread_wait_list; /* Thread stack size */ @@ -107,13 +107,13 @@ static bool is_thread_sys_inited = false; static os_thread_data supervisor_thread_data; /* Lock for thread data list */ -static mutex_t thread_data_lock; +static zmutex_t thread_data_lock; /* Thread data list */ static os_thread_data *thread_data_list = NULL; /* Lock for thread object list */ -static mutex_t thread_obj_lock; +static zmutex_t thread_obj_lock; /* Thread object list */ static os_thread_obj *thread_obj_list = NULL; @@ -121,7 +121,7 @@ static os_thread_obj *thread_obj_list = NULL; static void thread_data_list_add(os_thread_data *thread_data) { - mutex_lock(&thread_data_lock, K_FOREVER); + zmutex_lock(&thread_data_lock, K_FOREVER); if (!thread_data_list) thread_data_list = thread_data; else { @@ -129,7 +129,7 @@ thread_data_list_add(os_thread_data *thread_data) os_thread_data *p = thread_data_list; while (p) { if (p == thread_data) { - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); return; } p = p->next; @@ -139,13 +139,13 @@ thread_data_list_add(os_thread_data *thread_data) thread_data->next = thread_data_list; thread_data_list = thread_data; } - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); } static void thread_data_list_remove(os_thread_data *thread_data) { - mutex_lock(&thread_data_lock, K_FOREVER); + zmutex_lock(&thread_data_lock, K_FOREVER); if (thread_data_list) { if (thread_data_list == thread_data) thread_data_list = thread_data_list->next; @@ -158,32 +158,32 @@ thread_data_list_remove(os_thread_data *thread_data) p->next = p->next->next; } } - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); } static os_thread_data * thread_data_list_lookup(k_tid_t tid) { - mutex_lock(&thread_data_lock, K_FOREVER); + zmutex_lock(&thread_data_lock, K_FOREVER); if (thread_data_list) { os_thread_data *p = thread_data_list; while (p) { if (p->tid == tid) { /* Found */ - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); return p; } p = p->next; } } - mutex_unlock(&thread_data_lock); + zmutex_unlock(&thread_data_lock); return NULL; } static void thread_obj_list_add(os_thread_obj *thread_obj) { - mutex_lock(&thread_obj_lock, K_FOREVER); + zmutex_lock(&thread_obj_lock, K_FOREVER); if (!thread_obj_list) thread_obj_list = thread_obj; else { @@ -191,14 +191,14 @@ thread_obj_list_add(os_thread_obj *thread_obj) thread_obj->next = thread_obj_list; thread_obj_list = thread_obj; } - mutex_unlock(&thread_obj_lock); + zmutex_unlock(&thread_obj_lock); } static void thread_obj_list_reclaim() { os_thread_obj *p, *p_prev; - mutex_lock(&thread_obj_lock, K_FOREVER); + zmutex_lock(&thread_obj_lock, K_FOREVER); p_prev = NULL; p = thread_obj_list; while (p) { @@ -219,7 +219,7 @@ thread_obj_list_reclaim() p = p->next; } } - mutex_unlock(&thread_obj_lock); + zmutex_unlock(&thread_obj_lock); } int @@ -229,10 +229,10 @@ os_thread_sys_init() return BHT_OK; #if BH_ENABLE_ZEPHYR_MPU_STACK != 0 - mutex_init(&mpu_stack_lock); + zmutex_init(&mpu_stack_lock); #endif - mutex_init(&thread_data_lock); - mutex_init(&thread_obj_lock); + zmutex_init(&thread_data_lock); + zmutex_init(&thread_obj_lock); /* Initialize supervisor thread data */ memset(&supervisor_thread_data, 0, sizeof(supervisor_thread_data)); @@ -265,19 +265,19 @@ os_thread_cleanup(void) os_thread_data *thread_data = thread_data_current(); bh_assert(thread_data != NULL); - mutex_lock(&thread_data->wait_list_lock, K_FOREVER); + zmutex_lock(&thread_data->wait_list_lock, K_FOREVER); if (thread_data->thread_wait_list) { /* Signal each joining thread */ os_thread_wait_list head = thread_data->thread_wait_list; while (head) { os_thread_wait_list next = head->next; - sem_give(&head->sem); + zsem_give(&head->sem); /* head will be freed by joining thread */ head = next; } thread_data->thread_wait_list = NULL; } - mutex_unlock(&thread_data->wait_list_lock); + zmutex_unlock(&thread_data->wait_list_lock); thread_data_list_remove(thread_data); /* Set flag to true for the next thread creating to @@ -342,7 +342,7 @@ os_thread_create_with_prio(korp_tid *p_tid, thread_start_routine_t start, } memset(thread_data, 0, thread_data_size); - mutex_init(&thread_data->wait_list_lock); + zmutex_init(&thread_data->wait_list_lock); thread_data->stack_size = stack_size; thread_data->tid = tid; @@ -407,10 +407,10 @@ os_thread_join(korp_tid thread, void **value_ptr) if (!(node = BH_MALLOC(sizeof(os_thread_wait_node)))) return BHT_ERROR; - sem_init(&node->sem, 0, 1); + zsem_init(&node->sem, 0, 1); node->next = NULL; - mutex_lock(&thread_data->wait_list_lock, K_FOREVER); + zmutex_lock(&thread_data->wait_list_lock, K_FOREVER); if (!thread_data->thread_wait_list) thread_data->thread_wait_list = node; else { @@ -420,10 +420,10 @@ os_thread_join(korp_tid thread, void **value_ptr) p = p->next; p->next = node; } - mutex_unlock(&thread_data->wait_list_lock); + zmutex_unlock(&thread_data->wait_list_lock); /* Wait the sem */ - sem_take(&node->sem, K_FOREVER); + zsem_take(&node->sem, K_FOREVER); /* Wait some time for the thread to be actually terminated */ k_sleep(Z_TIMEOUT_MS(100)); @@ -436,14 +436,14 @@ os_thread_join(korp_tid thread, void **value_ptr) int os_mutex_init(korp_mutex *mutex) { - mutex_init(mutex); + zmutex_init(mutex); return BHT_OK; } int os_recursive_mutex_init(korp_mutex *mutex) { - mutex_init(mutex); + zmutex_init(mutex); return BHT_OK; } @@ -457,16 +457,16 @@ os_mutex_destroy(korp_mutex *mutex) int os_mutex_lock(korp_mutex *mutex) { - return mutex_lock(mutex, K_FOREVER); + return zmutex_lock(mutex, K_FOREVER); } int os_mutex_unlock(korp_mutex *mutex) { #if KERNEL_VERSION_NUMBER >= 0x020200 /* version 2.2.0 */ - return mutex_unlock(mutex); + return zmutex_unlock(mutex); #else - mutex_unlock(mutex); + zmutex_unlock(mutex); return 0; #endif } @@ -474,7 +474,7 @@ os_mutex_unlock(korp_mutex *mutex) int os_cond_init(korp_cond *cond) { - mutex_init(&cond->wait_list_lock); + zmutex_init(&cond->wait_list_lock); cond->thread_wait_list = NULL; return BHT_OK; } @@ -495,10 +495,10 @@ os_cond_wait_internal(korp_cond *cond, korp_mutex *mutex, bool timed, int mills) if (!(node = BH_MALLOC(sizeof(os_thread_wait_node)))) return BHT_ERROR; - sem_init(&node->sem, 0, 1); + zsem_init(&node->sem, 0, 1); node->next = NULL; - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); if (!cond->thread_wait_list) cond->thread_wait_list = node; else { @@ -508,15 +508,15 @@ os_cond_wait_internal(korp_cond *cond, korp_mutex *mutex, bool timed, int mills) p = p->next; p->next = node; } - mutex_unlock(&cond->wait_list_lock); + zmutex_unlock(&cond->wait_list_lock); /* Unlock mutex, wait sem and lock mutex again */ - mutex_unlock(mutex); - sem_take(&node->sem, timed ? Z_TIMEOUT_MS(mills) : K_FOREVER); - mutex_lock(mutex, K_FOREVER); + zmutex_unlock(mutex); + zsem_take(&node->sem, timed ? Z_TIMEOUT_MS(mills) : K_FOREVER); + zmutex_lock(mutex, K_FOREVER); /* Remove wait node from wait list */ - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); if (cond->thread_wait_list == node) cond->thread_wait_list = node->next; else { @@ -527,7 +527,7 @@ os_cond_wait_internal(korp_cond *cond, korp_mutex *mutex, bool timed, int mills) p->next = node->next; } BH_FREE(node); - mutex_unlock(&cond->wait_list_lock); + zmutex_unlock(&cond->wait_list_lock); return BHT_OK; } @@ -565,10 +565,10 @@ int os_cond_signal(korp_cond *cond) { /* Signal the head wait node of wait list */ - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); if (cond->thread_wait_list) - sem_give(&cond->thread_wait_list->sem); - mutex_unlock(&cond->wait_list_lock); + zsem_give(&cond->thread_wait_list->sem); + zmutex_unlock(&cond->wait_list_lock); return BHT_OK; } @@ -588,6 +588,67 @@ void os_thread_jit_write_protect_np(bool enabled) {} +int +os_rwlock_init(korp_rwlock *lock) +{ + if (!lock) { + return BHT_ERROR; + } + + k_mutex_init(&lock->mtx); + k_sem_init(&lock->sem, 0, K_SEM_MAX_LIMIT); + lock->read_count = 0; + + return BHT_OK; +} + +int +os_rwlock_rdlock(korp_rwlock *lock) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_rwlock_wrlock(korp_rwlock *lock) +{ + // Acquire the mutex to ensure exclusive access + if (k_mutex_lock(&lock->mtx, K_FOREVER) != 0) { + return BHT_ERROR; + } + + // Wait until there are no readers + while (lock->read_count > 0) { + // Release the mutex while we're waiting + k_mutex_unlock(&lock->mtx); + + // Wait for a short time + k_sleep(K_MSEC(1)); + + // Re-acquire the mutex + if (k_mutex_lock(&lock->mtx, K_FOREVER) != 0) { + return BHT_ERROR; + } + } + // At this point, we hold the mutex and there are no readers, so we have the + // write lock + return BHT_OK; +} + +int +os_rwlock_unlock(korp_rwlock *lock) +{ + k_mutex_unlock(&lock->mtx); + return BHT_OK; +} + +int +os_rwlock_destroy(korp_rwlock *lock) +{ + /* Not implemented */ + return BHT_ERROR; +} + int os_thread_detach(korp_tid thread) { @@ -607,13 +668,88 @@ int os_cond_broadcast(korp_cond *cond) { os_thread_wait_node *node; - mutex_lock(&cond->wait_list_lock, K_FOREVER); + zmutex_lock(&cond->wait_list_lock, K_FOREVER); node = cond->thread_wait_list; while (node) { os_thread_wait_node *next = node->next; - sem_give(&node->sem); + zsem_give(&node->sem); node = next; } - mutex_unlock(&cond->wait_list_lock); + zmutex_unlock(&cond->wait_list_lock); return BHT_OK; } + +korp_sem * +os_sem_open(const char *name, int oflags, int mode, int val) +{ + /* Not implemented */ + return NULL; +} + +int +os_sem_close(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_wait(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_trywait(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_post(korp_sem *sem) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_getvalue(korp_sem *sem, int *sval) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_sem_unlink(const char *name) +{ + /* Not implemented */ + return BHT_ERROR; +} + +int +os_blocking_op_init() +{ + /* Not implemented */ + return BHT_ERROR; +} + +void +os_begin_blocking_op() +{ + /* Not implemented */ +} + +void +os_end_blocking_op() +{ + /* Not implemented */ +} + +int +os_wakeup_blocking_op(korp_tid tid) +{ + /* Not implemented */ + return BHT_ERROR; +} \ No newline at end of file diff --git a/core/version.h b/core/version.h index 261c9b8cf9..1baffd2dc7 100644 --- a/core/version.h +++ b/core/version.h @@ -18,7 +18,7 @@ /* clang-format off */ #define WAMR_VERSION_MAJOR 2 #define WAMR_VERSION_MINOR 4 -#define WAMR_VERSION_PATCH 1 +#define WAMR_VERSION_PATCH 3 /* clang-format on */ #endif diff --git a/doc/build_wamr.md b/doc/build_wamr.md index 78e0711ec9..fa6c6af8db 100644 --- a/doc/build_wamr.md +++ b/doc/build_wamr.md @@ -20,6 +20,8 @@ add_library(vmlib ${WAMR_RUNTIME_LIB_SOURCE}) The script `runtime_lib.cmake` defines a number of variables for configuring the WAMR runtime features. You can set these variables in your CMakeList.txt or pass the configurations from cmake command line. +Please refer to [a full list of configuration options](./tired_support.md#appendix-all-compilation-flags). + ### **Configure platform and architecture** - **WAMR_BUILD_PLATFORM**: set the target platform. It can be set to any platform name (folder name) under folder [core/shared/platform](../core/shared/platform). @@ -57,7 +59,7 @@ cmake -DWAMR_BUILD_PLATFORM=linux -DWAMR_BUILD_TARGET=ARM - **WAMR_BUILD_LIBC_UVWASI**=1/0 (Experiment), build the [WASI](https://github.com/WebAssembly/WASI) libc subset for WASM app based on [uvwasi](https://github.com/nodejs/uvwasi) implementation, default to disable if not set -> Note: for platform which doesn't support **WAMR_BUILD_LIBC_WASI**, e.g. Windows, developer can try using **WAMR_BUILD_LIBC_UVWASI**. +> Note: WAMR doesn't support a safe sandbox on all platforms. For platforms that do not support **WAMR_BUILD_LIBC_WASI**, e.g. Windows, developers can try using an unsafe uvwasi-based WASI implementation by using **WAMR_BUILD_LIBC_UVWASI**. ### **Enable Multi-Module feature** @@ -297,6 +299,18 @@ Currently we only profile the memory consumption of module, module_instance and - **WAMR_BUILD_EXTENDED_CONST_EXPR**=1/0, default to disable if not set. > Note: See [Extended Constant Expressions](https://github.com/WebAssembly/extended-const/blob/main/proposals/extended-const/Overview.md) for more details. +### **Enable bulk-memory-opt** +- **WAMR_BUILD_BULK_MEMORY_OPT**=1/0, default to disable if not set. +> Note: See [bulk-memory-opt](https://github.com/WebAssembly/tool-conventions/blob/main/Lime.md#bulk-memory-opt) for more details. + +### **Enable call-indirect-overlong** +- **WAMR_BUILD_CALL_INDIRECT_OVERLONG**=1/0, default to disable if not set. +> Note: See [call-indirect-overlong](https://github.com/WebAssembly/tool-conventions/blob/main/Lime.md#call-indirect-overlong) for more details. + +### **Enable Lime1 target** +- **WAMR_BUILD_LIME1**=1/0, default to disable if not set. +> Note: See [Lime1](https://github.com/WebAssembly/tool-conventions/blob/main/Lime.md#lime1) for more details. + ### **Configurable memory access boundary check** - **WAMR_CONFIGURABLE_BOUNDS_CHECKS**=1/0, default to disable if not set > Note: If it is enabled, allow to run `iwasm --disable-bounds-checks` to disable the memory access boundary checks for interpreter mode. @@ -341,7 +355,7 @@ And the wasm app can calls below APIs to allocate/free memory from/to the shared We can combine the configurations. For example, if we want to disable interpreter, enable AOT and WASI, we can run command: ``` Bash -cmake .. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_AOT=1 -DWAMR_BUILD_LIBC_WASI=0 -DWAMR_BUILD_PLATFORM=linux +cmake .. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_AOT=1 -DWAMR_BUILD_LIBC_WASI=1 -DWAMR_BUILD_PLATFORM=linux ``` Or if we want to enable interpreter, disable AOT and WASI, and build as X86_32, we can run command: @@ -366,3 +380,10 @@ For Valgrind, begin with the following configurations and add additional ones as -DWAMR_DISABLE_WRITE_GS_BASE=0 #... ``` + +To enable the minimal Lime1 feature set, we need to disable some features that are on by default, such as +bulk memory and reference types: + +```Bash +cmake .. -DWAMR_BUILD_LIME1=1 -DWAMR_BUILD_BULK_MEMORY=0 -DWAMR_BUILD_REF_TYPES=0 -DDWAMR_BUILD_SIMD=0 +``` diff --git a/doc/build_wasm_app.md b/doc/build_wasm_app.md index c717c98e58..648d21534a 100644 --- a/doc/build_wasm_app.md +++ b/doc/build_wasm_app.md @@ -355,6 +355,8 @@ Usage: wamrc [options] -o output_file wasm_file llvmir-unopt Unoptimized LLVM IR llvmir-opt Optimized LLVM IR --disable-bulk-memory Disable the MVP bulk memory feature + --enable-bulk-memory-opt Enable bulk memory opt feature + --enable-extended-const Enable extended const expr feature --enable-multi-thread Enable multi-thread feature, the dependent features bulk-memory and thread-mgr will be enabled automatically --enable-tail-call Enable the post-MVP tail call feature @@ -363,6 +365,9 @@ Usage: wamrc [options] -o output_file wasm_file and by default it is enabled in x86-64 target and disabled in other targets --disable-ref-types Disable the MVP reference types feature + --enable-call-indirect-overlong + Enable call indirect overlong feature + --enable-lime1 Enable Lime1 --disable-aux-stack-check Disable auxiliary stack overflow/underflow check --enable-dump-call-stack Enable stack trace feature --enable-perf-profiling Enable function performance profiling @@ -382,9 +387,11 @@ a non-compatible`AOT_CURRENT_VERSION`. We try our best to maintain our runtime ABI for AoT-compiled modules compatible among WAMR versions with compatible `AOT_CURRENT_VERSION` so that combinations of older wamrc and newer runtime usually work. -However, there might be minor incompatibilities time to time. -For productions, we recommend to use compatible versions of -wamrc and the runtime. + +However, there might be minor incompatibilities from time to time. For +example, we usually avoid bumping the version when making a change which +affects only a small fraction of users. For productions, we recommend +using exactly same versions of wamrc and the runtime. | WAMR version | AOT_CURRENT_VERSION | Compatible AOT version | | | ------------ | ------------------- | ---------------------- | ---------------------- | diff --git a/doc/security_issue_runbook.md b/doc/security_issue_runbook.md index 1706b42c18..8b0bc7970b 100644 --- a/doc/security_issue_runbook.md +++ b/doc/security_issue_runbook.md @@ -25,6 +25,16 @@ For information on what types of issues are considered security vulnerabilities - Request CVE: Use the Big Green Button on the advisory to request a CVE number from GitHub staff. - Advanced Disclosure Email: Decide on a disclosure date, typically within a week, and send an email to sec-announce@bytecodealliance.org about the upcoming security release. Other ways are also available to communicate the disclosure date. +``` markdown +> A template for the advanced disclosure email + +The Wamr project would like to announce a forthcoming security release. + +The release will be made available on approximately YYYY-MM-DD. Additionally, an advisory will be made available on the same date at https://github.com/advisories. + +The highest severity issue fixed in this release is classified as XXX based on the CVSS classification scheme. +``` + ## Step 5: Preparing and Testing Patch Releases - Prepare PRs for Patch Releases: Create pull requests in the private fork for each version being patched. Ensure each PR is ready to apply cleanly and includes release notes for each release branch. @@ -38,6 +48,16 @@ For information on what types of issues are considered security vulnerabilities - Publish GitHub Advisories: Delete the private forks and use the Big Green Button to publish the advisory. - Send Security Release Email: Send a follow-up email to sec-announce@bytecodealliance.org describing the security release. Other communication channels can also be used to inform users about the security release. +```markdown +> A template for the security release email + +[Updated YYYY-MM-DD] Security release available. + +WAMR release version X.Y.Z is now available. The binary release can be found on GitHub at https://github.com/bytecodealliance/wasm-micro-runtime/releases/tag/WAMR-Y.Y.Z. This release addresses the following security issues rated XXX: https://the link of the advisory + +We’ll be conducting a full review of our security practices to ensure ample notification is provided for future security releases. +``` + By following these steps, you can effectively manage and resolve security issues for your open source project, ensuring timely communication and collaboration while maintaining the integrity and security of your software. ## References diff --git a/doc/security_need_to_know.md b/doc/security_need_to_know.md index b0d076d38d..f760e1e110 100644 --- a/doc/security_need_to_know.md +++ b/doc/security_need_to_know.md @@ -15,10 +15,41 @@ It is commonly stated that a security issue is an issue that: Given that WASI is a set of Capability-based APIs, all unauthorized actions are not supposed to happen. Most of the above security concerns can be alleviated. What remains for us is to ensure that the execution of Wasm modules is secure. In other words, do not compromise the sandbox. Unless it is explicitly disabled beforehand. -Thus, we share most of the criteria for judging security issues with [the Bytecode Alliance](https://github.com/bytecodealliance/rfcs/blob/main/accepted/what-is-considered-a-security-bug.md#definition). +### Is this bug considered a security vulnerability? -> [!NOTE] -> keep updating this document as the project evolves. +#### For someone who finds a problem + +if a bug **results in crash or hang**, please treat it as a security problem and report it to a security advisor. The maintainer will look into it and change its category if needed. It is better safe than sorry. + +If the author of an issue(results in crash or hang) can go through the following checklist and answer all questions with "No", it is fine to mark it as a regular bug. If not, please report it as a security issue. + +--- + +#### For those maintainers + +please use the following guidelines to determine if a bug or advisory is a security issue: + +Only bugs that affect [tier A platforms or features](./tiered_support.md) should be considered. + +Actions that differ from Wasm rules (like calculating wrong values) are not seen as security issues as long as they stay within the sandbox. + +By default, native APIs and CLIs are following the principle of **caller guarantee**. If the caller provides incorrect parameters or users input malformed options, it is not a security issue. For example, if a user passes an invalid file descriptor to `fd_read`, it is not a security issue. + +.wasm are not trusted. Malformed .wasm files should be handled gracefully. If a .wasm file causes a runtime crash or hang, it is a security issue. On the other hand, it's expected that aot runtime alone doesn't provide the same guarantee. So user-crafted .aot can cause anything, including crashes or hangs. They are not considered security issues. + +A denial-of-service (DoS) attack is a cyberattack that aims to make a computer or network resource unavailable to its users. If the service (runtime in this case) can recover and start another module or run another function within the same instance, it is not considered unavailable, and thus not a Denial of Service (DoS). + +Another type of execution problem we usually do not classify as a security one is if it is caused by an infinite loop or incorrect recursive function call chain. + +### When a maintainer identify a problem that should be classified as a security vulnerability + +Once a maintainer realizes an issue or PR describes a real or possible security vulnerability, act quickly to minimize exposure. Do not share technical details publicly on the issue or PR anymore. Maintainers should: + +- Close or edit the public discussion. Thank the person who reported it and explain that security-related issues should go through the Security Advisory process. Close the public issue or pull request as soon as possible to prevent further public sharing. If details have already been shared, consider editing or asking GitHub staff to remove sensitive content. + +- Create a Security Advisory. Invite the reporter to join as a collaborator or reporter. If the reporter is uncomfortable using GitHub Security Advisories, offer another private communication method, such as email. + +- Follow the guidelines in [the security issue runbook](./security_issue_runbook.md) for the next steps. ## reporting a security issue @@ -26,8 +57,4 @@ Follow the [same guidelines](https://bytecodealliance.org/security) as other pro ## managing a security issue -Before reporting an issue, particularly one related to crashing, consult [the cheat sheet](https://github.com/bytecodealliance/rfcs/blob/main/accepted/what-is-considered-a-security-bug.md#cheat-sheet-is-this-bug-considered-a-security-vulnerability), _Report a security vulnerability_ if it qualifies. - -Upon receiving an issue, thoroughly review [the cheat sheet](https://github.com/bytecodealliance/rfcs/blob/main/accepted/what-is-considered-a-security-bug.md#cheat-sheet-is-this-bug-considered-a-security-vulnerability) to assess and _Report a security vulnerability_ if the issue is indeed a security vulnerability. - Once a security issue is confirmed, please refer to [the runbook](./security_issue_runbook.md) for the subsequent steps to take. diff --git a/doc/stability_wasm_proposals.md b/doc/stability_wasm_proposals.md index e2bbe54e84..c8b90d5e44 100644 --- a/doc/stability_wasm_proposals.md +++ b/doc/stability_wasm_proposals.md @@ -12,53 +12,55 @@ Users can turn those features on or off by using compilation options. If a relev ## On-by-default Wasm Proposals -| Proposal | >= Phase 4 | Compilation Option | -| ------------------------------------- | ---------- | ------------------------ | -| Bulk memory operations | Yes | `WAMR_BUILD_BULK_MEMORY` | -| Fixed-width SIMD[^1] | Yes | `WAMR_BUILD_SIMD` | -| Multi-value | Yes | N/A | -| Non-trapping float-to-int conversions | Yes | N/A | -| Reference Types | Yes | `WAMR_BUILD_REF_TYPES` | -| Sign-extension operators | Yes | N/A | -| WebAssembly C and C++ API | No | N/A | +| Proposal | >= Phase 4 | Compilation Option | +| ------------------------------------- | ---------- |----------------------------| +| Bulk Memory Operations | Yes | `WAMR_BUILD_BULK_MEMORY` | +| Fixed-width SIMD[^1] | Yes | `WAMR_BUILD_SIMD` | +| Import/Export of Mutable Globals[^2] | Yes | N/A | +| Multi-value | Yes | N/A | +| Non-trapping float-to-int Conversions | Yes | N/A | +| Reference Types | Yes | `WAMR_BUILD_REF_TYPES` | +| Sign-extension Operators | Yes | N/A | +| WebAssembly C and C++ API | No | N/A | +| Branch Hinting | Yes | `WASM_ENABLE_BRANCH_HINTS` | [^1]: llvm-jit and aot only. +[^2]: in WAMR's implementation, if a mutable global shared by several wasm instances, each instance maintains its own copy of the global rather than sharing it. + ## Off-by-default Wasm Proposals -| Proposal | >= Phase 4 | Compilation Option | -| ----------------------------- | ---------- | -------------------------- | -| Garbage collection | Yes | `WAMR_BUILD_GC` | -| Legacy Exception handling[^2] | No | `WAMR_BUILD_EXCE_HANDLING` | -| Memory64 | Yes | `WAMR_BUILD_MEMORY64` | -| Multiple memories[^3] | Yes | `WAMR_BUILD_MULTI_MEMORY` | -| Reference-Typed Strings | No | `WAMR_BUILD_STRINGREF` | -| Tail call | Yes | `WAMR_BUILD_TAIL_CALL` | -| Threads[^4] | Yes | `WAMR_BUILD_SHARED_MEMORY` | -| Typed Function References | Yes | `WAMR_BUILD_GC` | - -[^2]: +| Proposal | >= Phase 4 | Compilation Option | +| ----------------------------- | ---------- | ---------------------------------| +| Extended Constant Expressions | Yes | `WAMR_BUILD_EXTENDED_CONST_EXPR` | +| Garbage Collection | Yes | `WAMR_BUILD_GC` | +| Legacy Exception Handling[^3] | No | `WAMR_BUILD_EXCE_HANDLING` | +| Memory64 | Yes | `WAMR_BUILD_MEMORY64` | +| Multiple Memories[^4] | Yes | `WAMR_BUILD_MULTI_MEMORY` | +| Reference-Typed Strings | No | `WAMR_BUILD_STRINGREF` | +| Tail Call | Yes | `WAMR_BUILD_TAIL_CALL` | +| Threads[^5] | Yes | `WAMR_BUILD_SHARED_MEMORY` | +| Typed Function References | Yes | `WAMR_BUILD_GC` | + +[^3]: interpreter only. [a legacy version](https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/legacy/Exceptions.md). This proposal is currently also known as the "legacy proposal" and still supported in the web, but can be deprecated in future and the use of this proposal is discouraged. -[^3]: interpreter only -[^4]: `WAMR_BUILD_LIB_PTHREAD` can also be used to enable +[^4]: interpreter only +[^5]: `WAMR_BUILD_LIB_PTHREAD` can also be used to enable ## Unimplemented Wasm Proposals | Proposal | >= Phase 4 | | ------------------------------------------- | ---------- | -| Branch Hinting | Yes | | Custom Annotation Syntax in the Text Format | Yes | -| Exception handling[^5] | Yes | -| Extended Constant Expressions | Yes | -| Import/Export of Mutable Globals | Yes | +| Exception Handling[^6] | Yes | | JS String Builtins | Yes | | Relaxed SIMD | Yes | -[^5]: [up-to-date version](https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md) +[^6]: [up-to-date version](https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md) ## On-by-default WASI Proposals diff --git a/doc/tiered_support.md b/doc/tiered_support.md new file mode 100644 index 0000000000..565d347b29 --- /dev/null +++ b/doc/tiered_support.md @@ -0,0 +1,196 @@ +# Tiered Supported + +**Tier definitions** + +- **A — Production Ready:** fully tested and stable. +- **B — Almost Production Ready:** partially tested; close to production. +- **C — Experimental / Not Production Ready:** unfinished or volatile. + +The condition _tested_ mentioned above specifically refers to whether there are enough tests in CI. + +## Architecture Support + +| Architecture | Tier | +| ------------ | ----- | +| **x86-64** | **A** | +| **x86-32** | **A** | +| AArch64 | B | +| ARC | B | +| ARM | B | +| RISCV32 | B | +| RISCV64 | B | +| THUMB | B | +| XTENSA | B | +| MIPS | C | + +## OS / Platform Support + +| Platform | Tier | +| ------------------ | ----- | +| **NuttX** | **A** | +| **Ubuntu** | **A** | +| Android | B | +| macOS | B | +| Windows | B | +| Zephyr | B | +| AliOS-Things | C | +| Cosmopolitan | C | +| ESP-IDF (FreeRTOS) | C | +| FreeBSD | C | +| iOS | C | +| RT-Thread | C | +| RIOT | C | +| VxWorks | C | + +## WebAssembly Proposal Support + +> During configuration, It is able to disable or enable the following features by setting the corresponding flags (see Appendix). It is also possible to check features status in the configuration output. + +| WASM Proposal / Extension | Tier | +| -------------------------------------- | ----------- | +| **Bulk Memory** | A | +| **Extended Constant Expressions** | A | +| **Import/Export of Mutable Globals** | A | +| **Memory64** | A | +| **Multi-value** | A | +| **Non-trapping float-to-int** | A | +| **Reference Types** | A | +| **Shared Memory (Threads)** | A | +| **SIMD (128-bit)** | A | +| **Sign-extension Operators** | A | +| GC (Garbage Collection) | B | +| Stringref | B | +| Tail Calls | B | +| Multi-memory | C | +| Legacy Exception Handling | C | +| Branch Hinting | Unsupported | +| Custom Annotation Syntax (text format) | Unsupported | +| Exception Handling (new spec) | Unsupported | +| JS String Builtins | Unsupported | +| Relaxed SIMD | Unsupported | + +# WAMR-Specific Feature Support + +> During configuration, It is able to disable or enable the following features by setting the corresponding flags (see Appendix). It is also possible to check features status in the configuration output. + +| WAMR Feature | Tier | +| --------------------------------- | ---- | +| **AoT (wamrc)** | A | +| **AOT intrinsics** | A | +| **Fast Interpreter** | A | +| **Interpreter (classic)** | A | +| **Libc builtin** | A | +| **Libc WASI** | A | +| **Quick AOT/JIT entries** | A | +| **Shrunk memory** | A | +| **Wakeup of blocking operations** | A | +| **WASM C API** | A | +| Fast JIT | B | +| LLVM ORC JIT | B | +| Memory profiling | B | +| Module instance context[^7] | B | +| Multi-module | B | +| Perf profiling | B | +| Pthread | B | +| Shared heap | B | +| WASI threads | B | +| WASI-NN (neural network APIs) | B | +| Debug Interpreter | B | +| Debug AOT | C | +| Tier-up (Fast JIT → LLVM JIT) | C | + +--- + +# Appendix: All compilation flags + +| Compilation flags | Tiered | Default | on Ubuntu | +| ------------------------------------------- | ------ | ------- | --------- | +| WAMR_APP_THREAD_STACK_SIZE_MAX | B | ND[^1] | | +| WAMR_BH_LOG | B | ND | | +| WAMR_BH_VPRINTF | B | ND | | +| WAMR_BUILD_ALLOC_WITH_USAGE | B | ND | | +| WAMR_BUILD_ALLOC_WITH_USER_DATA | B | ND | | +| WAMR_BUILD_AOT | A | ND | 1 | +| WAMR_BUILD_AOT_INTRINSICS | A | 1[^2] | | +| WAMR_BUILD_AOT_STACK_FRAME | A | ND | | +| WAMR_BUILD_AOT_VALIDATOR | B | ND | | +| WAMR_BUILD_BULK_MEMORY | A | 1 | | +| WAMR_BUILD_COPY_CALL_STACK | B | ND | | +| WAMR_BUILD_CUSTOM_NAME_SECTION | B | ND | | +| WAMR_BUILD_DEBUG_AOT | C | ND | | +| WAMR_BUILD_DEBUG_INTERP | B | ND | | +| WAMR_BUILD_DUMP_CALL_STACK | B | ND | | +| WAMR_BUILD_DYNAMIC_AOT_DEBUG | C | ND | | +| WAMR_BUILD_EXCE_HANDLING | C | 0 | | +| WAMR_BUILD_EXTENDED_CONST_EXPR | A | 0 | | +| WAMR_BUILD_FAST_INTERP | A | ND | 1 | +| WAMR_BUILD_FAST_JIT | B | ND | | +| WAMR_BUILD_FAST_JIT_DUMP | B | ND | | +| WAMR_BUILD_GC | B | 0 | | +| WAMR_BUILD_GC_HEAP_VERIFY | B | ND | | +| WAMR_BUILD_GLOBAL_HEAP_POOL | A | ND | | +| WAMR_BUILD_GLOBAL_HEAP_SIZE | A | ND | | +| WAMR_BUILD_INSTRUCTION_METERING | C | ND | | +| WAMR_BUILD_INTERP | A | ND | 1 | +| WAMR_BUILD_INVOKE_NATIVE_GENERAL | B | ND | | +| WAMR_BUILD_JIT | B | ND | | +| WAMR_BUILD_LAZY_JIT | B | 1[^3] | | +| WAMR_BUILD_LIBC_BUILTIN | A | ND | 1 | +| WAMR_BUILD_LIBC_EMCC | C | ND | | +| WAMR_BUILD_LIBC_UVWASI | C | ND | | +| WAMR_BUILD_LIBC_WASI | A | ND | 1 | +| WAMR_BUILD_LIB_PTHREAD | B | ND | | +| WAMR_BUILD_LIB_PTHREAD_SEMAPHORE | B | ND | | +| WAMR_BUILD_LIB_RATS | C | ND | | +| WAMR_BUILD_LIB_WASI_THREADS | B | ND | | +| WAMR_BUILD_LINUX_PERF | B | ND | | +| WAMR_BUILD_LIME1 | A | NO | | +| WAMR_BUILD_LOAD_CUSTOM_SECTION | A | ND | | +| WAMR_BUILD_MEMORY64 | A | 0 | | +| WAMR_BUILD_MEMORY_PROFILING | B | ND | | +| WAMR_BUILD_MINI_LOADER | B | ND | | +| WAMR_BUILD_MODULE_INST_CONTEXT | B | ND | 1 | +| WAMR_BUILD_MULTI_MEMORY | C | 0 | | +| WAMR_BUILD_MULTI_MODULE | B | ND | | +| WAMR_BUILD_PERF_PROFILING | B | ND | | +| WAMR_BUILD_PLATFORM | - | ND | linux | +| WAMR_BUILD_QUICK_AOT_ENTRY | A | 1[^4] | | +| WAMR_BUILD_REF_TYPES | A | ND | 1 | +| WAMR_BUILD_SANITIZER | B | ND | | +| WAMR_BUILD_SGX_IPFS | C | ND | | +| WAMR_BUILD_SHARED_HEAP | A | ND | | +| WAMR_BUILD_SHARED_MEMORY | A | 0 | 1 | +| WAMR_BUILD_SHRUNK_MEMORY | A | ND | 1 | +| WAMR_BUILD_SIMD | A | ND | 1 | +| WAMR_BUILD_SIMDE | A | ND | 1 | +| WAMR_BUILD_SPEC_TEST | A | ND | | +| WAMR_BUILD_STACK_GUARD_SIZE | B | ND | | +| WAMR_BUILD_STATIC_PGO | B | ND | | +| WAMR_BUILD_STRINGREF | B | 0 | | +| WAMR_BUILD_TAIL_CALL | A | 0 | 1 | +| WAMR_BUILD_TARGET | - | ND | X86-64 | +| WAMR_BUILD_THREAD_MGR | A | ND | | +| WAMR_BUILD_WAMR_COMPILER | A | ND | | +| WAMR_BUILD_WASI_EPHEMERAL_NN | B | ND | | +| WAMR_BUILD_WASI_NN | B | ND | | +| WAMR_BUILD_WASI_NN_ENABLE_EXTERNAL_DELEGATE | B | ND | | +| WAMR_BUILD_WASI_NN_ENABLE_GPU | B | ND | | +| WAMR_BUILD_WASI_NN_EXTERNAL_DELEGATE_PATH | B | ND | | +| WAMR_BUILD_WASI_NN_LLAMACPP | B | ND | | +| WAMR_BUILD_WASI_NN_ONNX | B | ND | | +| WAMR_BUILD_WASI_NN_OPENVINO | B | ND | | +| WAMR_BUILD_WASI_NN_TFLITE | B | ND | | +| WAMR_BUILD_WASI_TEST | B | ND | | +| WAMR_BUILD_WASM_CACHE | B | ND | | +| WAMR_CONFIGURABLE_BOUNDS_CHECKS | C | ND | | +| WAMR_DISABLE_APP_ENTRY | A | ND | | +| WAMR_DISABLE_HW_BOUND_CHECK | A | ND | | +| WAMR_DISABLE_STACK_HW_BOUND_CHECK | A | ND | | +| WAMR_DISABLE_WAKEUP_BLOCKING_OP | B | ND | | +| WAMR_DISABLE_WRITE_GS_BASE | B | ND | | +| WAMR_TEST_GC | B | ND | | + +[^1]: _ND_ represents _not defined_ +[^2]: active if `WAMR_BUILD_AOT` is 1 +[^3]: active if `WAMR_BUILD_FAST_JIT` or `WAMR_BUILD_JIT1` is 1 +[^4]: active if `WAMR_BUILD_AOT` or `WAMR_BUILD_JIT` is 1 diff --git a/gitbook/advance-tutorial/README.md b/gitbook/advance-tutorial/README.md new file mode 100644 index 0000000000..4a02cc026c --- /dev/null +++ b/gitbook/advance-tutorial/README.md @@ -0,0 +1,7 @@ +# Advance tutorial + +Welcome to the chapter of the advanced tutorial. + +If you care about performance(don't we all?), want to know whether WAMR stands out among other wasm runtimes with respect to your demands, or wish to fine-tune your wasm application's memory footprint. You could refer to [this section](performance-benchmark/README.md) + +In later sections, you can find the tutorial on how to use [application framework](../../doc/wamr_api.md) and [dynamic management](remote-applicatoin-management/README.md). Also, there is a tutorial on [how to port WAMR to the platform](../../doc/port_wamr.md) diff --git a/gitbook/advance-tutorial/performance-benchmark/README.md b/gitbook/advance-tutorial/performance-benchmark/README.md new file mode 100644 index 0000000000..84095e5d0f --- /dev/null +++ b/gitbook/advance-tutorial/performance-benchmark/README.md @@ -0,0 +1,18 @@ +# Performance Test + +Like word on the street said(no way it's just us saying!) or you may saw in previous chapters(maybe multiple times), WAMR is a **lightweight** standalone WebAssembly (WASM) runtime with **small footprint**, **high performance** and highly configurable features. + +Well, you don't have to take our word for it. You could run the [Benchmarks in our repo](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/tests/benchmarks) and decide whether the performance is good enough. + +We provide multiple benchmarks that you could try: + +- [PolyBench](../../../tests/benchmarks/polybench/README.md) +- [CoreMark](../../../tests/benchmarks/coremark/README.md) +- [Sightglass](../../../tests/benchmarks/sightglass/README.md) +- [JetStream2](../../../tests/benchmarks/jetstream/README.md) + +For the memory footprint, you can refer to the links below. + +- [Performance and footprint data](https://github.com/bytecodealliance/wasm-micro-runtime/wiki/Performance): checkout [here](https://github.com/bytecodealliance/wasm-micro-runtime/wiki/Performance) for the performance and footprint data + +And in the next section, we provide tutorials on memory usage tuning. You can [profile memory usage](../../../doc/build_wamr.md#enable-memory-profiling-experiment) and [tunning memory usage](../../../doc/memory_tune.md) diff --git a/gitbook/advance-tutorial/remote-applicatoin-management/README.md b/gitbook/advance-tutorial/remote-applicatoin-management/README.md new file mode 100644 index 0000000000..d1d2568feb --- /dev/null +++ b/gitbook/advance-tutorial/remote-applicatoin-management/README.md @@ -0,0 +1,7 @@ +# Remote application management + +The WAMR application manager supports **remote application management**(check out local directory {WAMR-DIR}/core/app-mgr or [same directory on GitHub](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/core/app-mgr) for more) from the host environment or the cloud through any physical communications such as TCP, UPD, UART, BLE, etc. Its modular design makes it able to support application management for different managed runtimes. + +The tool **host_tool** (check out local directory {WAMR-DIR}/test-tools/host-tool or [same directory on GitHub](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/test-tools/host-tool) for more) communicates to the WAMR app manager for installing/uninstalling the wasm applications on the companion chip from the host system. + +We have two example demos of the use of **host_tool**. One is the [simple example](../../../samples/simple/README.md) using the tool "host_tool" to remotely install/uninstall wasm applications from the WAMR runtime over either TCP socket or UART cable; the other is the [IoT App Store Demo](../../../test-tools/IoT-APP-Store-Demo/README.md) showing the concept of remotely managing the device applications from the cloud. diff --git a/gitbook/appendix/background_knowledge.md b/gitbook/appendix/background_knowledge.md new file mode 100644 index 0000000000..61c1719d2f --- /dev/null +++ b/gitbook/appendix/background_knowledge.md @@ -0,0 +1,61 @@ +# Some background knowledge + +In this section, we aggregate some basic background knowledge and jargon in our project field. This section could be served as a refresher for those who have left academia for a while and cannot fully recall all the weary details and exact meaning of jargon in the Compiler course. Also, it would be a great primer for those who did not take such a course and are interested in such a field(and, of course, our fantastic WAMR project). + +We think providing such a section would be nice so that you do not have to Google around. If there is anything you find inaccurate, you think should be included, or even better, you have something for us that would perfect this section, do feel free to reach out to us on [GitHub](https://github.com/bytecodealliance/wasm-micro-runtime)! + +Let's dive right into our exciting recitation/learning journey without further ado! + +## 1. Compiler + +### 1.1 What is a Compiler? + +Strictly speaking(formal definition you usually find in textbooks), the compiler is a special computer program, a system program(serves as a platform for other software), to be more precise. It takes a source program as input and outputs a target program. The source program is written in the source programming language, and usually, it is a high-level programming language such as C/C++, Java, Rust, and so on. The target program is written in a target programming language would be a low-level programming language like assembly. Take C/C++ as an example, the input for the GCC compiler(component) is a C/C++ translation unit(a source file along with any header it used), and the output is platform-dependent assembly code. + +However, in our daily life, what we usually mean when we refer to the word compiler is the compiler toolchain, which comprises a compiler, assembler, and linker. The assembler is in charge of translating the compiled translation unit(object file) from assembly to truly machine-readable machine code. The linker is used to link all the parts of the program(object files) into one executable file. Together, they can translate our human-readable source code(potentially many files) into a program that can run on the machine. + +For now, we will mainly focus on the more strict definition because I think the concept and algorithm compiler use more closely pertain to our WAMR project. + + + +### 1.2 Structure and algorithm involved + + + +Since we alright know what a compiler is, now let's learn more details about compilers. First, let's talk about the structure of the compiler and the algorithm related to each part. Typically, the compiler consists of three parts, Front End, Optimizer and Back End: + +- Front End: in some sense, this part is more "mature." The theory involved and actual implementation is more or less stable nowadays. Its primary purpose is to gather textual information from source-language programs and understand it syntactically and semantically. After that, it encodes the knowledge it has into Intermediate Representation. The theory behind Front End is formal language theory(Scanners & Parsers) and lattice theory(Elaboration for type checking). + +- Optimizer: as the name suggests, the Optimizer's goal is to optimize our program's performance. Clever readers may be conscious of the difficulty when they hear the word "optimize." Indeed, the Optimizer is very challenging to design and implement since it's a vital part of compiler infrastructure and imposes a heavy performance impact. It analyses the input IR and transforms it into definitive IR, usually through multiple passes, gradually accumulating knowledge of the program and applying a better(hopefully) transformation to it. The output(definitive IR) is semantically equivalent to the input IR to preserve the original meaning of the program we are compiling. The theories and algorithms that could be used for Optimizer are too many to list here. Here are examples: Number theory, some graph algorithms for static analysis, and fixed-point algorithms for data-flow analysis. It's still an active field that attracts many people to research. + +- Back End: the Back End is in charge of mapping programs (in IR form) to low-level code forms that can run on the target machine. Usually, there is more than one Back End, so the compiler is portable for different platforms (ISA). Its main functionality includes instruction selection, register allocation, and instruction scheduling, in which many algorithms are applied, like heuristic search, graph coloring, and some dynamic programming. Like Optimizer, the Back End has many open problems to tackle and also is a field many people hold great interest in. + +## 2. Interpreter + +### 2.1 What is an Interpreter? + +The Interpreter is also a system computer program. Like the compiler, it takes a source program as input; but instead of outputting a target program, it directly executes the program line by line and returns the corresponding results. One thing worth noting is that it's not uncommon for an interpreter to adapt widely used techniques in the compilers to improve its performance. Sometimes they are even used together. + +Based on the levels of the source language(high or low) and compilation strategies, the interpreters can be divided into several different categories. Let's look at them in more detail in the following section. + +### 2.2 Technique and jargon in Interpreter + +- Bytecode: + + The bytecode is a kind of low-level programming language in a very highly optimized and compact format. It could be the target language for the compiler. Because the instruction-like bytecode can be executed line by line in an interpreter on any platform, regardless of what hardware-related ISA it uses, it is also called p-code(portable). One example of bytecode you may be familiar with is Java bytecode. + +- Ahead-of-time(AOT) and Just-in-time(JIT) compilation: + + - AOT: as the name suggests, the AOT compilation means that the compilation happens before the program run time. Normally the target language after AOT compilation is some low-level machine code or bytecode. Then the compiled code can be executed by either a process VM or a normal computer. + + - JIT: just in time compilation is a technique widely adopted by the Interpreter to improve its performance. It detects the heavily used code section when interpreting the program and compiles them into more efficient machine code. When that code section is called again, the machine code is executed rather than having the bytecode interpreted. + +## 3. Virtual machines + +When it comes to the word "Virtual Machines," we usually would remember or refer to that System virtual machines managed by hypervisors such as KVM, VirtualBox, or VMware. We often use them as a substitute for real computers to resolve dependency or compatibility issues for courses or daily work. + +But there is also another type of virtual machine you may have heard of(even you may get really confused at first) and related more closely to the field where our project is. Process (application) virtual machines provide an environment independent of hardware, aiming to run computer programs written in a certain language. Take JVM as an example. It provides an environment for Java bytecode to execute across many platforms. + +## 4. Runtime system + +It's a rather vague term that is really difficult to explain or understand. To make things worse, when people sometimes refer to it as runtime, it's easily confused with compilation runtime, runtime library. The runtime system is an infrastructure that participates in the creation and running of our program. Typically, the components are the execution environment(Application VM maybe) to provide a place for the program to run, and the compiler front end or/and compiler back end to do the necessary analysis, transformation(from source code to bytecode), and optimization. diff --git a/gitbook/appendix/webassembly_details.md b/gitbook/appendix/webassembly_details.md new file mode 100644 index 0000000000..ea11a4ffb4 --- /dev/null +++ b/gitbook/appendix/webassembly_details.md @@ -0,0 +1,6 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# WebAssembly details + +Meanwhile, if you can't wait to learn more about Wasm, check out this book: _WebAssembly in Action_. It's a great book showcasing wasm basics and how to use wasm with JavaScript inside a browser. diff --git a/gitbook/basics/getting-started/README.md b/gitbook/basics/getting-started/README.md new file mode 100644 index 0000000000..4a6ca20e6b --- /dev/null +++ b/gitbook/basics/getting-started/README.md @@ -0,0 +1,13 @@ +# Getting started: a hello world program + +In this chapter, you'll learn how to run a simple hello world wasm program on your host or the Docker environment using WAMR. The docker tutorial is recommended so you don't have to worry about all the platform-related dependencies and compatibility problems. The hello world program will give you a taste of what our WAMR could do as server-side runtime and ready you for a more detailed guide at the end of this chapter. The [latter guide](../../../doc/build_wasm_app.md) covers the meaning of the compile and build option in detail and gives suggestions on fine-tuning your wasm module. More example programs can be found in [chapter 4. features](../../features/README.md) + +Now, here is the last piece of gibberish before you get your hand dirty: + +Clone our source code repo and use + +```sh +git clone https://github.com/bytecodealliance/wasm-micro-runtime.git +``` + +Or download from use any way you like diff --git a/gitbook/basics/getting-started/host_prerequsites.md b/gitbook/basics/getting-started/host_prerequsites.md new file mode 100644 index 0000000000..d6ab33cf82 --- /dev/null +++ b/gitbook/basics/getting-started/host_prerequsites.md @@ -0,0 +1,40 @@ +# Prerequisites for your host environment + +## Ubuntu + +First, install the needed packages and libraries. + +```sh +apt-get update \ + && apt-get install -y apt-transport-https apt-utils build-essential \ + ca-certificates curl g++-multilib git gnupg \ + libgcc-9-dev lib32gcc-9-dev lsb-release \ + ninja-build ocaml ocamlbuild python2.7 \ + software-properties-common tree tzdata \ + unzip valgrind vim wget zip --no-install-recommends +``` + +Then install CMake and wasi-sdk-16.0 + +```sh +wget --progress=dot:giga -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg > /dev/null \ + && echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ bionic main' | tee /etc/apt/sources.list.d/kitware.list >/dev/null \ + && apt-get update \ + && rm /usr/share/keyrings/kitware-archive-keyring.gpg \ + && apt-get install -y kitware-archive-keyring --no-install-recommends \ + && apt-get install -y cmake --no-install-recommends + +wget -c --progress=dot:giga https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-16/wasi-sdk-16.0-linux.tar.gz -P /opt \ + && tar xf /opt/wasi-sdk-16.0-linux.tar.gz -C /opt \ + && ln -fs /opt/wasi-sdk-16.0 /opt/wasi-sdk \ + && rm /opt/wasi-sdk-16.0-linux.tar.gz +``` + +This should be sufficient to build WAMR and run our hello world program. + \ No newline at end of file diff --git a/gitbook/basics/getting-started/on_docker.md b/gitbook/basics/getting-started/on_docker.md new file mode 100644 index 0000000000..2dd7c77a71 --- /dev/null +++ b/gitbook/basics/getting-started/on_docker.md @@ -0,0 +1,26 @@ +# Using docker + +Now that we have set up docker, we could run the following command directly in VS Code terminal(or the bash of your if you prefer ssh docker container directly). + +Similarly, build iwasm vmcore. + +```sh +cd product-mini/platforms/linux +mkdir build && cd build +cmake .. +make +``` + +Then you are ready to go to the directory that contains the hello world program and copy our iwasm vmcore + +```sh +cp iwasm ../../../app-samples/hello-world +cd ../../../app-samples/hello-world +./build.sh +``` + +Now you can execute your first wasm program! + +```sh +./iwasm test.wasm +``` diff --git a/gitbook/basics/getting-started/on_host.md b/gitbook/basics/getting-started/on_host.md new file mode 100644 index 0000000000..df8689ffb7 --- /dev/null +++ b/gitbook/basics/getting-started/on_host.md @@ -0,0 +1,26 @@ +# Compile, build and test hello world on the host + +Now we have our host set up, we can build our hello world program and run it using WAMR. + +First, build iwasm vmcore on your platform. + +```sh +cd ${WAMR-dir}/product-mini/platforms/${your platform} +mkdir build && cd build +cmake .. +make +``` + +Then you are ready to go to the directory that contains the hello world program and copy our iwasm vmcore + +```sh +cp iwasm ../../../app-samples/hello-world +cd ${WAMR-dir}/product-mini/app-samples/hello-world +./build.sh +``` + +Now you could execute your first wasm program! + +```sh +./iwasm test.wasm +``` diff --git a/gitbook/basics/introduction/README.md b/gitbook/basics/introduction/README.md new file mode 100644 index 0000000000..6886d072b8 --- /dev/null +++ b/gitbook/basics/introduction/README.md @@ -0,0 +1,5 @@ +# Introduction + +In this chapter, we will introduce you to some basic knowledge about [WebAssembly](./webassembly.md) and our project [WAMR](./wamr_project.md). And discuss the security feature that Webassembly language itself and WAMR's enhancement can bring in [this section](./security_feature.md) + +We understand because our backgrounds vary, some terms in the following section may sound familiar but vague. We have a primer in [Appendix A](../../appendix/background_knowledge.md) gathering some details about background knowledge(compiler, interpreter, runtime system, all other jargon) that may be helpful and free you from googling around. You are more than welcome to check it out. diff --git a/gitbook/basics/introduction/security_feature.md b/gitbook/basics/introduction/security_feature.md new file mode 100644 index 0000000000..f375b99f1c --- /dev/null +++ b/gitbook/basics/introduction/security_feature.md @@ -0,0 +1,147 @@ +# The Security of WebAssembly and WAMR's implementation + +WebAssembly is a cutting-edge programming language that helps Web applications such as PhotoShop Online run at native speed in the browser and offers a sandbox mechanism to protect the host environment from malicious attacks cross the world. Beyond the browser, the Wasm can be executed in standalone runtime such as WAMR safely without the need of additional security support from OS and HW. + +## WebAssembly Security Overview + +The security features of WebAssembly(More detailed Wasm language-level security features can be found on the official [WebAssembly website](https://webassembly.org/docs/security/)) + +WebAssembly (Wasm) is designed with two key security goals: + +1. protecting users from malicious or faulty modules + +2. providing developers with robust tools for building secure applications. + +### User Protection + +Each WebAssembly module executes within a sandboxed environment separated from the host runtime using fault isolation techniques. This implies: + +- Applications execute independently, and can't escape the sandbox without going through appropriate APIs. +- Applications generally execute deterministically with limited exceptions. + +Modules must also comply with the security policies of the host environment, such as the same-origin policy in browsers or POSIX on other platforms. + +### Developer Safety Tools + +WebAssembly's design emphasizes security by removing unsafe execution features while maintaining compatibility with C/C++ programs. + +Key safety features include: + +- **Control-flow Integrity (CFI):** + - Modules must declare all accessible functions and their types at load time, enforcing structured control flow. + - Immutable, non-observable compiled code prevents control-flow hijacking attacks. + +- **Function Calls:** + - Calls must reference a valid function index. + - Indirect function calls are checked at runtime for type signature compatibility. + - A protected call stack prevents buffer overflows, ensuring safe returns. + - Branches are restricted to valid destinations within the current function. + +- **Variable Handling:** + - Local variables (fixed scope) are initialized to zero and stored in the protected call stack. + - Global variables are stored in the global index space and can be imported from external modules. + - Variables with unclear static scope (e.g., structs or address-of operator) are stored in isolated linear memory, which has bounds checking and zero-initialization by default. + +- **Traps:** + - Used to terminate execution and signal errors (e.g., invalid index, type mismatch, stack overflow, out-of-bounds memory access, or illegal arithmetic). + - In a browser, traps trigger a JavaScript exception. Future updates may support custom module-defined trap handlers. + +Future improvements may introduce multiple memory sections and finer memory controls (e.g., shared memory, page protection). + +### Memory Safety + +WebAssembly improves memory safety by eliminating common bugs found in traditional C/C++ programs: + +- **Buffer Overflows**: Local and global variables are fixed-size and stored by index, preventing buffer overflows from affecting adjacent memory. Linear memory regions, though, can overwrite objects, but bounds checking and control-flow integrity (CFI) prevent direct code injection, so mitigation like DEP or SSP is unnecessary. + +- **Pointer Safety**: Unsafe pointer usage, like dereferencing unallocated memory or accessing freed memory, is minimized. WebAssembly removes pointer semantics for function calls and variables with fixed scope, and invalid index references result in load-time validation errors or runtime traps. Linear memory is bounds-checked at the region level and zero-initialized by default. + +- **Control Flow Protection**: Although WebAssembly prevents direct code injection, code reuse attacks targeting indirect calls are still possible. However, conventional ROP attacks are infeasible due to CFI, which enforces valid call targets declared at load time. + +- **Potential Vulnerabilities**: Race conditions (e.g., TOCTOU) and side-channel attacks (e.g., timing attacks) are possible, as WebAssembly offers no scheduling guarantees. Future enhancements may introduce memory randomization, code diversification, and bounded pointers to strengthen protection. + +### Control-Flow Integrity (CFI) + +Wasm ensures CFI for both direct and indirect function calls as well as function returns. It uses explicit function section indexes and runtime type checks to verify safe transitions. However, as mentioned above, while these mechanisms prevent most code injection, indirect call exploits using code reuse techniques are still possible. + +Developers can enhance security by enabling fine-grained CFI through Clang/LLVM's WebAssembly support, which adds richer type-level checks and mitigates indirect call attacks, albeit with minor performance trade-offs. + +## WAMR Security Features + +The WebAssembly Micro Runtime (WAMR) is designed to provide an efficient, secure, and lightweight runtime for WebAssembly on standalone devices. It offers a full coverage of the WebAssembly specification and added additional security enhancements to ensure safe execution of Wasm modules. + +### Wasm Language Security Features + +WAMR enforces WebAssembly language-level security features rigorously, ensuring that each Wasm module undergoes comprehensive validation at the loading phase and that execution conforms to the WebAssembly specification during runtime. + +#### Module Validation + +Before execution, WAMR validates the Wasm module to ensure it adheres to the WebAssembly specification. This involves several key checks: + +- **Format Validation**: Ensuring the binary is well-formed and compliant with the Wasm format. This checks the structure, ensuring correct definitions for functions, memory segments, tables, and types. + +- **Type Checking**: All function signatures, local variables, and global variables are verified against their declared types. This ensures type safety across calls and memory operations. + +- **Control Flow Integrity**: Verifies the function call graph to ensure that all function indices and signatures are valid and that function calls do not violate control-flow safety rules. + +- **Operand Stack Integrity**: WAMR ensures that operand stack overflows and underflows are checked during validation. For each function, the number of values pushed and popped from the operand stack must match the declared function signature, avoiding stack imbalances. + +- **Memory and Table Boundaries**: Ensures that memory and table sizes do not exceed predefined limits and that access to these regions remains within bounds. + +#### Module Execution + +During runtime, WAMR ensures that execution strictly conforms to the WebAssembly spec and maintains the security guarantees made at load time: + +- **Memory Safety**: Memory access, both direct and indirect, is rigorously checked. WAMR prevents out-of-bounds access, helping mitigate common vulnerabilities like buffer overflows. + + - Implementation of **Boundary Checks**: WAMR can leverage either software boundary checks or hardware boundary checks. For software boundary checks, before each memory access, the address is validated to ensure it falls within the allowable bounds of the allocated memory. For hardware boundary checks, protection mechanisms such as `mmap`-based memory protection, where sections of memory can be made non-writable or non-executable to prevent invalid memory address access. + +- Like previously mentioned, applications generally execute deterministically with **limited exceptions**, which can be handled in the runtime rather than simply crushing or causing undefined behavior. The exceptions that WAMR can handle include but are not limited to: + + - EXCE_UNREACHABLE: Triggered when unreachable code is executed. + - EXCE_OUT_OF_MEMORY: Signaled when the runtime runs out of memory. + - EXCE_OUT_OF_BOUNDS_MEMORY_ACCESS: Raised when memory access goes out of bounds. + - EXCE_INTEGER_OVERFLOW: Detects integer overflow during arithmetic operations. + - EXCE_INTEGER_DIVIDE_BY_ZERO: Handles division by zero in integer operations. + - EXCE_INVALID_CONVERSION_TO_INTEGER: Raised when an invalid conversion to an integer occurs. + - EXCE_INVALID_FUNCTION_TYPE_INDEX: Triggered when an invalid function type index is accessed. + - EXCE_INVALID_FUNCTION_INDEX: Signaled when an invalid function index is used. + - EXCE_UNDEFINED_ELEMENT: Raised when accessing an undefined element. + - EXCE_UNINITIALIZED_ELEMENT: Triggered when an uninitialized element is accessed. + - EXCE_CALL_UNLINKED_IMPORT_FUNC: Handles calls to unlinked imported functions. + - EXCE_NATIVE_STACK_OVERFLOW: Triggered when the native stack exceeds its limit. + - EXCE_UNALIGNED_ATOMIC: Raised when an unaligned atomic operation is attempted. + - EXCE_AUX_STACK_OVERFLOW: Signals that the auxiliary stack has overflowed. + - EXCE_AUX_STACK_UNDERFLOW: Triggered when the auxiliary stack is underflowed. + - EXCE_OUT_OF_BOUNDS_TABLE_ACCESS: Raised when accessing a table out of bounds. + - EXCE_OPERAND_STACK_OVERFLOW: Signaled when the operand stack overflows. + +These features, combined with the robust validation and execution checks, ensure that WAMR achieves comprehensive security for running WebAssembly modules. + +### Extra Enhancements on Security + +WAMR goes beyond the standard WebAssembly security features by offering additional mechanisms to enhance the security of applications, particularly in the areas of native API access control and hardware-based security. + +#### Native API Export Control + +WAMR allows WebAssembly applications to interact with the host environment through **exported native APIs**. However, unrestricted access to these APIs can introduce security risks, such as unauthorized system calls or resource manipulation. To mitigate these risks, WAMR implements a **fine-grained access control** mechanism for native APIs: + +- **Restricted API Access**: Developers can explicitly define which native APIs are exposed to WebAssembly modules, limiting the surface area for potential misuse. This allows for precise control over which system resources (e.g., file system, networking, I/O devices) can be accessed by a module. + +- **Custom API Policies**: WAMR supports customizable policies, enabling developers to set permissions and constraints on how WebAssembly modules can interact with native APIs. This is particularly useful for sandboxing untrusted code while still allowing necessary functionality under controlled conditions. + +- **API Call Validation**: All calls to native APIs are validated at runtime to ensure that they conform to the defined policies, preventing unauthorized or malicious API usage. + +#### Intel SGX Remote Attestation + +WAMR enhances security for trusted execution environments (TEEs) through its support for **Intel Software Guard Extensions (SGX)**, which provides hardware-level security features, including **remote attestation**: + +- **SGX Integration**: WAMR can run WebAssembly modules within an SGX enclave, a protected area of execution that provides isolation from the rest of the system. This ensures that even if the host machine is compromised, the code and data within the enclave remain secure. + +- **Remote Attestation**: WAMR supports SGX remote attestation, allowing remote parties to verify that a WebAssembly module is running inside a genuine SGX enclave. This involves generating and sending an **attestation report**, which proves the authenticity of the enclave and the integrity of the code running inside it. + + - **Endorsement of Trusted Execution**: The attestation process ensures that the WebAssembly module and its execution environment have not been tampered with, providing assurance to remote users that the module is running in a secure, trusted state. + +- **Sealing and Unsealing**: WAMR supports SGX's data sealing features, enabling WebAssembly modules to securely store sensitive data on disk. Sealed data can only be accessed by the same enclave in future executions, protecting it from unauthorized access even if the host system is compromised. + +These features enhance WAMR’s security, making it suitable for use cases that require both flexible native API access and strong hardware-backed guarantees of code integrity and confidentiality. diff --git a/gitbook/basics/introduction/wamr_project.md b/gitbook/basics/introduction/wamr_project.md new file mode 100644 index 0000000000..0cba5b084c --- /dev/null +++ b/gitbook/basics/introduction/wamr_project.md @@ -0,0 +1,65 @@ +# WAMR project + + In this section, we will introduce the basics of project WAMR to you. In each brief introduction section, you are more than welcome to jump to details of that section triggering your interest. + +## What is it? + +WebAssembly Micro Runtime (WAMR) is a [Bytecode Alliance](https://bytecodealliance.org/) project. A lightweight standalone WebAssembly (WASM) runtime with a small footprint, high performance, and highly configurable features for applications across from embedded, IoT, edge to Trusted Execution Environment (TEE), smart contract, cloud-native, and so on. + +## Why you may want to use it + + + +As we explained in the previous section, WebAssembly is great for code reuse on the server side with the help of runtime like our Project WAMR. So the most straightforward way is to use WAMR to run your WASM program. + +It's not limited to simply being a command line application that runs your wasm program. You could also use it as a library, integrated into your application to run any wasm program inside your application. Although most user cases are embedding WAMR in their C/C++ program, we do support other [language-binding](../../tutorial/language-embedding/README.md) so that you could use WAMR in some language you prefer. + +## Component of WAMR + + + +There are four parts of WAMR. Two main parts of WAMR are: + +1. The "iwasm" VM core to run WASM applications. It has many features and achieves several functionalities. The complete list of features and examples demonstrating it can be found in [Features](../../features/README.md). Here are some brief introductions of some features that may interest you: + + - Flexibility: It supports multiple running modes to provide the ideal responsive time and performance on your demand. The running mode includes interpreter mode, AOT mode (Ahead-of-Time compilation), and JIT modes (Just-in-Time compilation, LLVM JIT, and Fast JIT are supported). Details on how to build and use each mode properly and where you may want to use it can be found in [Tutorial](../../tutorial/README.md) + + - High Performance: WAMR achieves nearly native speed by AOT and JIT modes. It also has a small runtime binary size (~85K for interpreter and ~50K for AOT) and low memory usage + + - Portability: It supports many architectures and platforms. + + The architectures it supports: + + - X86-64, X86-32 + - ARM, THUMB (ARMV7 Cortex-M7 and Cortex-A15 are tested) + - AArch64 (Cortex-A57 and Cortex-A53 are tested) + - RISCV64, RISCV32 (RISC-V LP64 and RISC-V LP64D are tested) + - XTENSA, MIPS, ARC + + The platforms it supports: + + - [Linux](../../../doc/build_wamr.md#linux), [Linux SGX (Intel Software Guard Extension)](../../../doc/linux_sgx.md), [MacOS](../../../doc/build_wamr.md#macos), [Android](../../../doc/build_wamr.md#android), [Windows](../../../doc/build_wamr.md#windows), [Windows (MinGW)](../../../doc/build_wamr.md#mingw) + + - [Zephyr](../../../doc/build_wamr.md#zephyr), [AliOS-Things](../../../doc/build_wamr.md#alios-things), [VxWorks](../../../doc/build_wamr.md#vxworks), [NuttX](../../../doc/build_wamr.md#nuttx), [RT-Thread](../../../doc/build_wamr.md#RT-Thread), [ESP-IDF](../../../doc/build_wamr.md#esp-idf) + + It enables true cross-platform development experience. You can even port WAMR to a new platform following [this tutorial](../../../doc/port_wamr.md). Though it's unlikely since we support many platforms, having such features is comforting. + + - Security: It has Linux SGX (Intel Software Guard Extension) support. Through this unique application isolation technology, your application data is as safe as it can be. + +2. The "wamrc" AOT compiler to compile WASM files into AOT files for best performance and smaller runtime footprint, which is run by "iwasm" VM Core + + Both the wasm binary files and AOT files are supported by iwasm. The wamrc AOT compiler compiles a wasm binary file to an AOT file, which can also be run by iwasm. The speed by AOT and JIT are near to native. + +The other 2 parts are: + +1. Application framework: + + The WAMR application manager supports remote application management from the host environment or the cloud through any physical communications such as TCP, UPD, UART, BLE, etc. Its modular design makes it able to support application management for different managed runtimes. + +2. Application manager: + + By using the iwasm VM core, we are flexible to build different application frameworks for specific domains, although it would take quite some effort. + + The WAMR has offered a comprehensive framework for programming WASM applications for device and IoT usages. The framework supports running multiple applications that are based on the event-driven programming model. Here are the supporting API sets by the WAMR application framework library : + + - Timer, Inter-app communication (request/response and pub/sub), Sensor, Connectivity and data transmission, 2D graphic UI diff --git a/gitbook/basics/introduction/webassembly.md b/gitbook/basics/introduction/webassembly.md new file mode 100644 index 0000000000..65e2fe3521 --- /dev/null +++ b/gitbook/basics/introduction/webassembly.md @@ -0,0 +1,52 @@ +# WebAssembly + +In this section, you will learn the basics of WebAssembly. More details about WebAssembly can be found in [Appendix B](../../appendix/webassembly_details.md) + +## Overview + +Like its name suggest, in a sense, it is related to the Web and Assembly. Web means that it, like many other forerunners, like asm.js, trying to improve JavaScript's performance in Browsers. And the Assembly means that the format of WebAssembly is not a human-readable format but a compact binary format that is more efficient for Browsers to use. To conclude, WebAssembly (Wasm) is a compact, binary instruction format tailored for a stack-based virtual machine. It serves as a portable compilation target for various programming languages, enabling smooth deployment across both client and server environments on the web. It aims to provide benefits such as: + +- High Performance + + Wasm is built for fast execution and compact encoding, allowing programs to be efficiently transmitted and quickly loaded. By leveraging the common hardware capabilities across platforms, WebAssembly can run at near-native speeds. + +- Secure Execution Environment + + Wasm operates within a memory-safe, sandboxed environment, which can be implemented even inside existing JavaScript engines. When integrated into web applications, it adheres to the same-origin policy and browser-based permission models, ensuring robust security. + +- Open and Debuggable Format + + Wasm is designed with a textual representation that aids in debugging, testing, and optimization. This human-readable format allows developers to experiment, learn, and even hand-code Wasm modules. When viewed on the web, this text format makes Wasm modules easily accessible for inspection. + +- A Core Part of the Open Web + + Built to uphold the versionless and backward-compatible nature of the web, WebAssembly seamlessly interacts with JavaScript and can access web APIs. Beyond web applications, Wasm is versatile and supports other non-web environments as well. + +In [The State of WebAssembly 2023](https://www.cncf.io/reports/the-state-of-webassembly-2023/) from SlashData, Linux Foundation, and the Cloud Native Computing Foundation, some key insights into the current status and adoption of WebAssembly can be found. Including the top reason why people want to use WebAssembly: + +- Faster loading times 23% +- Exploring new use cases and technologies 22% +- Sharing code between projects 20% +- Improved performance over JavaScript 20% +- Efficient execution of computationally intensive tasks 19% +- Binaries run anywhere 18% +- Sandboxed security 18% +- Language agnostic 18% + +What makes it even better is that, like Javascript, shortly after the appearance of WebAssembly, it is not limited to the browser. It could also be used server-side. Many WebAssembly runtimes are out there, including our project WAMR. + +## How does it work + +### A browser example + +The most straightforward place you could think of when it comes to the use of WebAssembly is in the browser. + +Emscripten is a compiler toolchain for WebAssembly. It took the C/C++(or any other programming language LLVM frontend support) source program as input and translated it into the WebAssembly target program module. + +Optionally, an HTML and a Javascript file are generated alongside a wasm file, so the plumbing JS code is ready for you to call your wasm module. And you could open HTML on your browser to see the result of your wasm program. + +Here is the more detailed [emscripten official tutorial](https://emscripten.org/docs/getting_started/Tutorial.html) you could follow to write your hello world wasm program and run it on the browser. + +### A server-side example + +A hello world example using our WAMR can be found [here](../getting-started/README.md) diff --git a/gitbook/examples/README.md b/gitbook/examples/README.md new file mode 100644 index 0000000000..300a39f926 --- /dev/null +++ b/gitbook/examples/README.md @@ -0,0 +1,11 @@ +# More Examples + +In this chapter, we provide some extra useful examples to demonstrate how you may want to use WAMR: + +- [File Interaction Of WASI](../../samples/file/README.md): Demonstrating the supported file interaction API of WASI. This sample can also demonstrate the SGX IPFS (Intel Protected File System), enabling an enclave to seal and unseal data at rest. + +- [GUI Examples](gui-examples/README.md): We provide two examples that both use [LVGL library](https://github.com/lvgl/lvgl) + +- [Concurrent WASM Application](../../samples/spawn-thread): Demonstrating how to execute wasm functions of the same wasm application concurrently in threads created by host embedder or runtime, but not the wasm application itself. + +- [Workload](../../samples/workload/README.md): Demonstrating how to build and run some complex workloads, e.g., tensorflow-lite, XNNPACK, wasm-av1, meshoptimizer, and bwa. diff --git a/gitbook/features/README.md b/gitbook/features/README.md new file mode 100644 index 0000000000..de538076c8 --- /dev/null +++ b/gitbook/features/README.md @@ -0,0 +1,39 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# Features And Examples + + + +In this chapter, you can see the complete list of features that WAMR support. And for each feature, we have an example followed demonstrating the usage of such a feature. + +## IWASM features + +### Key features + +- Full compliant to the W3C WASM MVP +- Small runtime binary size (~85K for interpreter and ~50K for AOT) and low memory usage +- Near to native speed by AOT and JIT +- Self-implemented AOT module loader to enable AOT work on Linux, Windows, MacOS, Android, SGX, and MCU systems +- Choices of WASM application libc support: the built-in libc subset for the embedded environment or [WASI](https://github.com/WebAssembly/WASI) for the standard libc +- [The simple C APIs to embed WAMR into host environment](../../doc/embed_wamr.md), see [how to integrate WAMR](../../doc/embed_wamr.md) and the [API list](../../core/iwasm/include/wasm_export.h) +- [The mechanism to export native APIs to WASM applications](../../doc/export_native_api.md), see [how to register native APIs](../../doc/export_native_api.md) +- [Multiple modules as dependencies](../../doc/multi_module.md), ref to [document](../../doc/multi_module.md) and [sample](../../samples/multi-module) +- [Multi-thread, pthread APIs and thread management](../../doc/pthread_library.md), ref to [document](../../doc/pthread_library.md) and [sample](../../samples/multi-thread) +- [Linux SGX (Intel Software Guard Extension) support](../../doc/linux_sgx.md), ref to [document](../../doc/linux_sgx.md) +- [Source debugging support](../../doc/source_debugging.md), ref to [document](../../doc/source_debugging.md) +- [WAMR-IDE (Experimental)](../../test-tools/wamr-ide) to develop WebAssembly applications with build, run and debug support, ref to [document](../../test-tools/wamr-ide) +- [XIP (Execution In Place) support](../../doc/xip.md), ref to [document](../../doc/xip.md) +- [Berkeley/Posix Socket support](../../doc/socket_api.md), ref to [document](../../doc/socket_api.md) and [sample](../../samples/socket-api) +- Language bindings: [Go](../../language-bindings/go/README.md), [Python](../../language-bindings/python/README.md) + +### WASM post-MVP features + +There are many post-MVP features for WASM. We support some of them. You can see the details in [this section](demo-examples/README.md) + +- [wasm-c-api](https://github.com/WebAssembly/wasm-c-api) +- [128-bit SIMD](https://github.com/WebAssembly/simd) +- [Reference Types](https://github.com/WebAssembly/reference-types) +- [Non-trapping float-to-int conversions](https://github.com/WebAssembly/nontrapping-float-to-int-conversions) +- [Sign-extension operators](https://github.com/WebAssembly/sign-extension-ops), [Bulk memory operations](https://github.com/WebAssembly/bulk-memory-operations) +- [Multi-value](https://github.com/WebAssembly/multi-value), [Tail-call](https://github.com/WebAssembly/tail-call), [Shared memory](https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#shared-linear-memory) diff --git a/gitbook/features/demo-examples/README.md b/gitbook/features/demo-examples/README.md new file mode 100644 index 0000000000..8f6c89155f --- /dev/null +++ b/gitbook/features/demo-examples/README.md @@ -0,0 +1,15 @@ +# WASM post-MVP features + +The ones we support: + +- [wasm-c-api](https://github.com/WebAssembly/wasm-c-api), ref to [document](../../../doc/wasm_c_api.md) and [sample](../../../samples/wasm-c-api) + +- [128-bit SIMD](https://github.com/WebAssembly/simd), ref to [samples/workload](../../../samples/workload/README.md) + +- [Reference Types](https://github.com/WebAssembly/reference-types), ref to [document](../../../doc/ref_types.md) and [sample](../../../samples/ref-types) + +Other post-MVP features: + +- [Non-trapping float-to-int conversions](https://github.com/WebAssembly/nontrapping-float-to-int-conversions) +- [Sign-extension operators](https://github.com/WebAssembly/sign-extension-ops), [Bulk memory operations](https://github.com/WebAssembly/bulk-memory-operations) +- [Multi-value](https://github.com/WebAssembly/multi-value), [Tail-call](https://github.com/WebAssembly/tail-call), [Shared memory](https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#shared-linear-memory) diff --git a/gitbook/features/user-case/README.md b/gitbook/features/user-case/README.md new file mode 100644 index 0000000000..dea2acbcc6 --- /dev/null +++ b/gitbook/features/user-case/README.md @@ -0,0 +1,10 @@ +# User case + +WAMR is widely used in a lot of areas. Here are some cases: + +- [Hyperledger Private Data Objects](https://github.com/hyperledger-labs/private-data-objects/blob/main/common/interpreter/wawaka_wasm/README.md) +- [Inclavare Containers](https://github.com/alibaba/inclavare-containers) +- [Fassm](https://github.com/faasm/faasm) +- [Waft](https://developer.aliyun.com/article/787582) +- [Envoy Proxy](https://github.com/envoyproxy/envoy) +- [Apache Teaclave](https://teaclave.apache.org/docs/executing-wasm) diff --git a/gitbook/home_page.md b/gitbook/home_page.md new file mode 100644 index 0000000000..831c167f01 --- /dev/null +++ b/gitbook/home_page.md @@ -0,0 +1,15 @@ +# Welcome + +Welcome to the home page of WAMR documentation, [WebAssembly Micro Runtime](https://github.com/bytecodealliance/wasm-micro-runtime) is an open-source project under [Bytecode Alliance](https://bytecodealliance.org/). As the name suggests, it is a lightweight standalone WebAssembly (WASM) runtime with a small footprint, high performance, and highly configurable features for applications across from embedded, IoT, edge Trusted Execution Environment (TEE), smart contract, cloud-native, and so on. + +## How to navigate the documentation + +If you are a complete beginner who just stepped into the world of WebAssembly or just looking to kill some time and learn something fun, start with [appendix A. background knowledge 101](appendix/background_knowledge.md) and our [chapter 1. introduction](basics/introduction/README.md). Also, you could learn how to run a hello world server-side wasm application using runtime WAMR in [chapter 2. getting started](basics/getting-started/README.md). + +Suppose you are somewhat familiar with WebAssembly and want to explore what WAMR can do for you as a user and developer. You could first check out [chapter 3. tutorial on how to use WAMR](tutorial/README.md), including [introduction to different running modes](tutorial/running-modes/README.md), how to [build different running modes](tutorial/build-tutorial/README.md), how to [embed WAMR into your application](tutorial/language-embedding/README.md) and how to [debug with WAMR](tutorial/debugging%26IDE-support/README.md). Then you could visit the complete list of [chapter 5. features](features/README.md) WAMR supported to see whether specific feature interest you and would serve your demands well. If the time comes when you start to optimize and consider improving performance or want to utilize the advanced feature, including **application framework** and **dynamic management**. In that case, you could find them in [chapter 4. advance tutorial](advance-tutorial/README.md). + +And, of course, you can always utilize the search function in the top right corner to locate whichever topic you are interested in + +## Social + +Feel free to check out our [blog](https://bytecodealliance.github.io/wamr.dev/) from time to time! We have some great blogs that either showcase some WAMR features and use cases or discuss some interesting topics on WAMR/WASM. diff --git a/gitbook/programmer's-manual/C_API_Lists.md b/gitbook/programmer's-manual/C_API_Lists.md new file mode 100644 index 0000000000..abaef36e81 --- /dev/null +++ b/gitbook/programmer's-manual/C_API_Lists.md @@ -0,0 +1,3 @@ +# Complete C/C++ API Lists + +The complete C/C++ lists for embedding the WAMR VM core can be found in the header file [wasm_export.h](https://github.com/bytecodealliance/wasm-micro-runtime/blob/main/core/iwasm/include/wasm_export.h). diff --git a/gitbook/programmer's-manual/README.md b/gitbook/programmer's-manual/README.md new file mode 100644 index 0000000000..fa098060ce --- /dev/null +++ b/gitbook/programmer's-manual/README.md @@ -0,0 +1,6 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# Programmer's Manual + +Complete List of C APIs can be found [here](gitbook/programmer's_manual/C_API_Lists.md) diff --git a/gitbook/tutorial/README.md b/gitbook/tutorial/README.md new file mode 100644 index 0000000000..85b63677f0 --- /dev/null +++ b/gitbook/tutorial/README.md @@ -0,0 +1,9 @@ +# Tutorial + +In this chapter, we want to walk you through the basic development knowledge and skills of WARM you may need so that you are ready to write your wasm application with WARM. + +For starters, you could learn how to compile different running mode of WAMR and their usage in [this section](build-tutorial/README.md). + +Then, as we said before, WAMR is not limited to being a command line application that runs wasm code. You could also [embed WAMR](language-embedding/README.md) into your application. + +And don't forget the one important stage of developing, namely debugging. We cover it in [this section](debugging%26IDE-support/README.md). diff --git a/gitbook/tutorial/build-tutorial/README.md b/gitbook/tutorial/build-tutorial/README.md new file mode 100644 index 0000000000..dee388f970 --- /dev/null +++ b/gitbook/tutorial/build-tutorial/README.md @@ -0,0 +1,36 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- +# build tutorial + +In this chapter, we provide a detailed tutorial on how to build [iwasm vmcore](../../../doc/build_wamr.md) and [wamrc](build_wamrc.md). + +## Quick build matrix + +Our powerful **iwasm vmcore** provide various running mode you could choose using the compile CMake option. Here is the matrix for different running mode and their attributes: + +| Running mode | CMake build options | Pros and Cons | +| ----------- | ----------- | --------- | +| AOT | none(default) | | +| Classic Interpreter | -DWAMR_BUILD_FAST_INTERP=0 | | +| Fast Interpreter | none(default) | | +| LLVM JIT | -DWAMR_BUILD_JIT=1 | | +| Fast JIT | -DWAMR_BUILD_FAST_JIT=1 | | + +## Supported architectures and platforms + +Here is a list of architectures and platforms WAMR support. You could click on the link for quick reference. + +The iwasm supports the following architectures: + +- X86-64, X86-32 +- ARM, THUMB (ARMV7 Cortex-M7 and Cortex-A15 are tested) +- AArch64 (Cortex-A57 and Cortex-A53 are tested) +- RISCV64, RISCV32 (RISC-V LP64 and RISC-V LP64D are tested) +- XTENSA, MIPS, ARC + +The following platforms are supported. Click each link below for how to build iwasm on that platform. Refer to [WAMR porting guide](../../../doc/port_wamr.md) for how to port WAMR to a new platform. + +- [Linux](../../../doc/build_wamr.md#linux), [Linux SGX (Intel Software Guard Extension)](../../../doc/linux_sgx.md), [MacOS](../../../doc/build_wamr.md#macos), [Android](../../../doc/build_wamr.md#android), [Windows](../../../doc/build_wamr.md#windows), [Windows (MinGW)](../../../doc/build_wamr.md#mingw) + +- [Zephyr](../../../doc/build_wamr.md#zephyr), [AliOS-Things](../../../doc/build_wamr.md#alios-things), [VxWorks](../../../doc/build_wamr.md#vxworks), [NuttX](../../../doc/build_wamr.md#nuttx), [RT-Thread](../../../doc/build_wamr.md#RT-Thread), [ESP-IDF](../../../doc/build_wamr.md#esp-idf) diff --git a/gitbook/tutorial/build-tutorial/build_wamrc.md b/gitbook/tutorial/build-tutorial/build_wamrc.md new file mode 100644 index 0000000000..891d7d7d44 --- /dev/null +++ b/gitbook/tutorial/build-tutorial/build_wamrc.md @@ -0,0 +1,23 @@ +# How to Build wamrc AOT compiler + +Both the WASM binary file and AOT file are supported by iwasm. The wamrc AOT compiler compiles wasm binary file to AOT file, which can also be run by iwasm. Execute the following commands to build **wamrc** compiler for Linux: + +```shell +cd wamr-compiler +./build_llvm.sh (or "./build_llvm_xtensa.sh" to support xtensa target) +mkdir build && cd build +cmake .. (or "cmake .. -DWAMR_BUILD_PLATFORM=darwin" for MacOS) +make +# wamrc is generated under current directory +``` + +For **Windows**: + +```shell +cd wamr-compiler +python build_llvm.py +mkdir build && cd build +cmake .. +cmake --build . --config Release +# wamrc.exe is generated under .\Release directory +``` diff --git a/gitbook/tutorial/debugging&IDE-support/README.md b/gitbook/tutorial/debugging&IDE-support/README.md new file mode 100644 index 0000000000..e03d0e7a92 --- /dev/null +++ b/gitbook/tutorial/debugging&IDE-support/README.md @@ -0,0 +1,3 @@ +# debugging & IDE support + +Has concern about debugging when it comes to a newly emerging technique like wasm? No worries, we got you covered. You could either [debug directly with lldb](../../../doc/source_debugging.md), or you could even [debug using VS Code](../../../test-tools/wamr-ide/README.md) diff --git a/gitbook/tutorial/language-embedding/README.md b/gitbook/tutorial/language-embedding/README.md new file mode 100644 index 0000000000..14c92a22f1 --- /dev/null +++ b/gitbook/tutorial/language-embedding/README.md @@ -0,0 +1,9 @@ +# language embedding + +As we mentioned before, WAMR is not only a server-side runtime for a wasm application but also a library that you could embed in your application. What's even better is that we support several programming languages so that you can choose your favorite language to embed WAMR to run the wasm app. + +The language WAMR support embedding: + +- [C/C++](../../../doc/embed_wamr.md) +- [Python](../../../language-bindings/python/README.md) +- [Go](../../../language-bindings/go/README.md) diff --git a/gitbook/tutorial/running-modes/README.md b/gitbook/tutorial/running-modes/README.md new file mode 100644 index 0000000000..c5f3c909d5 --- /dev/null +++ b/gitbook/tutorial/running-modes/README.md @@ -0,0 +1,29 @@ +--- +description: "This page is under construction/refinement. p.s. wanna hear a construction joke? we are still working on it" +--- + +# WAMR Running Modes + +## Brief Introduction + +In this section, we want to introduce running modes and their difference to you + +### "iwasm" VM core running mode + +It could run an AOT file(compiled by wamrc AOT compiler) in AOT running mode + +- AOT: Ahead-of-Time compilation. As you can guess from the name, we first need to use the *wamrc* compiler to compile wasm file to the AOT file. Then it could be run with our *iwasm* vmcore. In this running mode, we could achieve the nearly native speed(the best of all running modes) with very small footprint and quick startup + +It could run wasm applications in Interpreter/JIT running mode: + +- Interpreter: + Interpreters are very useful when debugging or studying, but their performance is relatively poor compared with other running modes. We support two running modes of the interpreter: + - Classic Interpreter: plain interpreter running mode + - Fast Interpreter: as you can guess from the name, the fast interpreter runs ~2X faster than the classic interpreter but consumes about 2X memory to hold the pre-compiled code. +- JIT: + Using the Just-in-Time compilation technique, we could make iwasm run much faster than Interpreter mode and sometimes very close to the speed of AOT running mode. We support two running modes of JIT: + - LLVM JIT: the JIT engine is implemented based on LLVM codegen. The performance of LLVM JIT is better than Fast JIT, with ~2x of the latter. But the startup time is slower than Fast JIT. + - Fast JIT: the JIT engine is implemented based on self-implemented codegen and asmjit encoder library. It is a lightweight JIT engine with small footprint, quick startup, good portability and relatively good performance. Currently it supports x86-64 target and Linux/Linux-SGX/MacOS platforms. The performance of Fast JIT is ~50% of the performance of LLVM JIT. + + +For more detailed introduction, kindly refer to this article(**incoming**) in our blog. diff --git a/product-mini/platforms/android/CMakeLists.txt b/product-mini/platforms/android/CMakeLists.txt index 19bc1b11e7..9cc8cc6b94 100644 --- a/product-mini/platforms/android/CMakeLists.txt +++ b/product-mini/platforms/android/CMakeLists.txt @@ -111,9 +111,6 @@ set_version_info (vmlib) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/common/libc_wasi.c b/product-mini/platforms/common/libc_wasi.c index 51255f7ac4..eb2e8c27f3 100644 --- a/product-mini/platforms/common/libc_wasi.c +++ b/product-mini/platforms/common/libc_wasi.c @@ -141,7 +141,7 @@ libc_wasi_parse(char *arg, libc_wasi_parse_context_t *ctx) } ctx->addr_pool[ctx->addr_pool_size++] = token; - token = strtok(NULL, ";"); + token = strtok(NULL, ","); } } else if (!strncmp(arg, "--allow-resolve=", 16)) { diff --git a/product-mini/platforms/common/wasm_proposal.c b/product-mini/platforms/common/wasm_proposal.c index 3c04d46ecf..8a4c3d44f9 100644 --- a/product-mini/platforms/common/wasm_proposal.c +++ b/product-mini/platforms/common/wasm_proposal.c @@ -12,14 +12,15 @@ wasm_proposal_print_status(void) { printf("About Wasm Proposals:\n"); printf(" Always-on:\n"); + printf(" - Import/Export of Mutable Globals\n"); printf(" - Multi-value\n"); - printf(" - Non-trapping float-to-int conversions\n"); - printf(" - Sign-extension operators\n"); + printf(" - Non-trapping float-to-int Conversions\n"); + printf(" - Sign-extension Operators\n"); printf(" - WebAssembly C and C++ API\n"); printf(" Compilation Configurable. 0 is OFF. 1 is ON:\n"); printf(" - Bulk Memory Operation via WASM_ENABLE_BULK_MEMORY: %u\n", WASM_ENABLE_BULK_MEMORY); - printf(" - Fixed-Width SIMD via WASM_ENABLE_SIMD: %u\n", + printf(" - Fixed-width SIMD via WASM_ENABLE_SIMD: %u\n", WASM_ENABLE_SIMD); printf(" - Garbage Collection via WASM_ENABLE_GC: %u\n", WASM_ENABLE_GC); printf( @@ -27,7 +28,7 @@ wasm_proposal_print_status(void) WASM_ENABLE_EXCE_HANDLING); printf(" - Memory64 via WASM_ENABLE_MEMORY64: %u\n", WASM_ENABLE_MEMORY64); - printf(" - Multiple Memory via WASM_ENABLE_MULTI_MEMORY: %u\n", + printf(" - Multiple Memories via WASM_ENABLE_MULTI_MEMORY: %u\n", WASM_ENABLE_MULTI_MEMORY); printf(" - Reference Types via WASM_ENABLE_REF_TYPES: %u\n", WASM_ENABLE_REF_TYPES); @@ -42,9 +43,7 @@ wasm_proposal_print_status(void) printf(" Unsupported (>= Phase4):\n"); printf(" - Branch Hinting\n"); printf(" - Custom Annotation Syntax in the Text Format\n"); - printf(" - Exception handling\n"); - printf(" - Extended Constant Expressions\n"); - printf(" - Import/Export of Mutable Globals\n"); + printf(" - Exception Handling\n"); printf(" - JS String Builtins\n"); printf(" - Relaxed SIMD\n"); } diff --git a/product-mini/platforms/cosmopolitan/CMakeLists.txt b/product-mini/platforms/cosmopolitan/CMakeLists.txt index 7676ea6fb8..37641497aa 100644 --- a/product-mini/platforms/cosmopolitan/CMakeLists.txt +++ b/product-mini/platforms/cosmopolitan/CMakeLists.txt @@ -136,11 +136,6 @@ set_version_info (vmlib) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/ios/CMakeLists.txt b/product-mini/platforms/ios/CMakeLists.txt index ca54aa1556..bc8542ffe9 100644 --- a/product-mini/platforms/ios/CMakeLists.txt +++ b/product-mini/platforms/ios/CMakeLists.txt @@ -113,9 +113,6 @@ include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/linux/CMakeLists.txt b/product-mini/platforms/linux/CMakeLists.txt index cef8329d77..e369197dc9 100644 --- a/product-mini/platforms/linux/CMakeLists.txt +++ b/product-mini/platforms/linux/CMakeLists.txt @@ -139,11 +139,6 @@ check_pie_supported() set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index f95b0d2d66..f013ec9d0b 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -57,6 +57,10 @@ print_help(void) #else printf(" --heap-size=n Set maximum heap size in bytes, default is 16 KB when libc wasi is diabled\n"); #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + printf(" --shared-heap-size=n Create shared heap of n bytes and attach to the wasm app.\n"); + printf(" The size n will be adjusted to a minumum number aligned to page size\n"); +#endif #if WASM_ENABLE_FAST_JIT != 0 printf(" --jit-codecache-size=n Set fast jit maximum code cache size in bytes,\n"); printf(" default is %u KB\n", FAST_JIT_DEFAULT_CODE_CACHE_SIZE / 1024); @@ -76,7 +80,7 @@ print_help(void) printf(" Use comma to separate, e.g. --enable-segue=i32.load,i64.store\n"); printf(" and --enable-segue means all flags are added.\n"); #endif -#endif /* WASM_ENABLE_JIT != 0*/ +#endif /* WASM_ENABLE_JIT != 0 */ #if WASM_ENABLE_LINUX_PERF != 0 printf(" --enable-linux-perf Enable linux perf support. It works in aot and llvm-jit.\n"); #endif @@ -400,7 +404,7 @@ unregister_and_unload_native_libs(uint32 native_lib_count, static char * handle_module_path(const char *module_path) { - /* next character after = */ + /* next character after '=' */ return (strchr(module_path, '=')) + 1; } @@ -578,6 +582,11 @@ main(int argc, char *argv[]) #else uint32 heap_size = 16 * 1024; #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + SharedHeapInitArgs shared_heap_init_args; + uint32 shared_heap_size = 0; + void *shared_heap = NULL; +#endif #if WASM_ENABLE_FAST_JIT != 0 uint32 jit_code_cache_size = FAST_JIT_DEFAULT_CODE_CACHE_SIZE; #endif @@ -685,6 +694,13 @@ main(int argc, char *argv[]) return print_help(); heap_size = atoi(argv[0] + 12); } +#if WASM_ENABLE_SHARED_HEAP != 0 + else if (!strncmp(argv[0], "--shared-heap-size=", 19)) { + if (argv[0][19] == '\0') + return print_help(); + shared_heap_size = atoi(argv[0] + 19); + } +#endif #if WASM_ENABLE_FAST_JIT != 0 else if (!strncmp(argv[0], "--jit-codecache-size=", 21)) { if (argv[0][21] == '\0') @@ -1007,6 +1023,25 @@ main(int argc, char *argv[]) } #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + if (shared_heap_size > 0) { + memset(&shared_heap_init_args, 0, sizeof(shared_heap_init_args)); + shared_heap_init_args.size = shared_heap_size; + shared_heap = wasm_runtime_create_shared_heap(&shared_heap_init_args); + + if (!shared_heap) { + printf("Create preallocated shared heap failed\n"); + goto fail6; + } + + /* attach module instance to the shared heap */ + if (!wasm_runtime_attach_shared_heap(wasm_module_inst, shared_heap)) { + printf("Attach shared heap failed.\n"); + goto fail6; + } + } +#endif + ret = 0; const char *exception = NULL; if (is_repl_mode) { @@ -1050,6 +1085,9 @@ main(int argc, char *argv[]) } #endif +#if WASM_ENABLE_SHARED_HEAP != 0 +fail6: +#endif #if WASM_ENABLE_THREAD_MGR != 0 fail5: #endif diff --git a/product-mini/platforms/rt-thread/iwasm.c b/product-mini/platforms/rt-thread/iwasm.c index 9c2b43b791..39ddfaebb7 100644 --- a/product-mini/platforms/rt-thread/iwasm.c +++ b/product-mini/platforms/rt-thread/iwasm.c @@ -262,6 +262,7 @@ iwasm(int argc, char **argv) wasm_module_t wasm_module = NULL; wasm_module_inst_t wasm_module_inst = NULL; RuntimeInitArgs init_args; + struct InstantiationArgs2 *inst_args; static char error_buf[128] = { 0 }; /* avoid stack overflow */ #if WASM_ENABLE_LIBC_WASI != 0 @@ -369,13 +370,23 @@ iwasm(int argc, char **argv) rt_kprintf("%s\n", error_buf); goto fail2; } + + if (!wasm_runtime_instantiation_args_create(&inst_args)) { + rt_kprintf("failed to create instantiate args\n"); + goto fail3; + } + wasm_runtime_instantiation_args_set_default_stack_size(inst_args, + stack_size); + wasm_runtime_instantiation_args_set_host_managed_heap_size(inst_args, + heap_size); #if WASM_ENABLE_LIBC_WASI != 0 libc_wasi_init(wasm_module, argc, argv, &wasi_parse_ctx); #endif rt_memset(error_buf, 0x00, sizeof(error_buf)); - wasm_module_inst = wasm_runtime_instantiate( - wasm_module, stack_size, heap_size, error_buf, sizeof(error_buf)); + wasm_module_inst = wasm_runtime_instantiate_ex2( + wasm_module, inst_args, error_buf, sizeof(error_buf)); + wasm_runtime_instantiation_args_destroy(inst_args); if (!wasm_module_inst) { rt_kprintf("%s\n", error_buf); goto fail3; diff --git a/product-mini/platforms/windows/CMakeLists.txt b/product-mini/platforms/windows/CMakeLists.txt index 2a4017d686..39b373deb0 100644 --- a/product-mini/platforms/windows/CMakeLists.txt +++ b/product-mini/platforms/windows/CMakeLists.txt @@ -114,9 +114,6 @@ if (NOT MINGW) set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") endif () -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang" OR MSVC)) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/product-mini/platforms/windows/main.c b/product-mini/platforms/windows/main.c index 31680da8a8..4be3a76cbe 100644 --- a/product-mini/platforms/windows/main.c +++ b/product-mini/platforms/windows/main.c @@ -14,70 +14,77 @@ #include "../common/libc_wasi.c" #endif +#include "../common/wasm_proposal.c" + static int app_argc; static char **app_argv; -#define MODULE_PATH ("--module-path=") - /* clang-format off */ static int -print_help() +print_help(void) { printf("Usage: iwasm [-options] wasm_file [args...]\n"); printf("options:\n"); - printf(" -f|--function name Specify a function name of the module to run rather\n" - " than main\n"); + printf(" -f|--function name Specify a function name of the module to run rather\n" + " than main\n"); #if WASM_ENABLE_LOG != 0 - printf(" -v=n Set log verbose level (0 to 5, default is 2) larger\n" - " level with more log\n"); + printf(" -v=n Set log verbose level (0 to 5, default is 2) larger\n" + " level with more log\n"); #endif #if WASM_ENABLE_INTERP != 0 - printf(" --interp Run the wasm app with interpreter mode\n"); + printf(" --interp Run the wasm app with interpreter mode\n"); #endif #if WASM_ENABLE_FAST_JIT != 0 - printf(" --fast-jit Run the wasm app with fast jit mode\n"); + printf(" --fast-jit Run the wasm app with fast jit mode\n"); #endif #if WASM_ENABLE_JIT != 0 - printf(" --llvm-jit Run the wasm app with llvm jit mode\n"); + printf(" --llvm-jit Run the wasm app with llvm jit mode\n"); #endif #if WASM_ENABLE_JIT != 0 && WASM_ENABLE_FAST_JIT != 0 && WASM_ENABLE_LAZY_JIT != 0 - printf(" --multi-tier-jit Run the wasm app with multi-tier jit mode\n"); + printf(" --multi-tier-jit Run the wasm app with multi-tier jit mode\n"); #endif - printf(" --stack-size=n Set maximum stack size in bytes, default is 64 KB\n"); + printf(" --stack-size=n Set maximum stack size in bytes, default is 64 KB\n"); #if WASM_ENABLE_LIBC_WASI !=0 printf(" --heap-size=n Set maximum heap size in bytes, default is 0 KB when libc wasi is enabled\n"); #else printf(" --heap-size=n Set maximum heap size in bytes, default is 16 KB when libc wasi is diabled\n"); #endif -#if WASM_ENABLE_GC != 0 - printf(" --gc-heap-size=n Set maximum gc heap size in bytes,\n"); - printf(" default is %u KB\n", GC_HEAP_SIZE_DEFAULT / 1024); -#endif #if WASM_ENABLE_SHARED_HEAP != 0 printf(" --shared-heap-size=n Create shared heap of n bytes and attach to the wasm app.\n"); printf(" The size n will be adjusted to a minumum number aligned to page size\n"); #endif +#if WASM_ENABLE_FAST_JIT != 0 + printf(" --jit-codecache-size=n Set fast jit maximum code cache size in bytes,\n"); + printf(" default is %u KB\n", FAST_JIT_DEFAULT_CODE_CACHE_SIZE / 1024); +#endif +#if WASM_ENABLE_GC != 0 + printf(" --gc-heap-size=n Set maximum gc heap size in bytes,\n"); + printf(" default is %u KB\n", GC_HEAP_SIZE_DEFAULT / 1024); +#endif #if WASM_ENABLE_JIT != 0 printf(" --llvm-jit-size-level=n Set LLVM JIT size level, default is 3\n"); printf(" --llvm-jit-opt-level=n Set LLVM JIT optimization level, default is 3\n"); +#endif /* WASM_ENABLE_JIT != 0 */ + printf(" --repl Start a very simple REPL (read-eval-print-loop) mode\n" + " that runs commands in the form of `FUNC ARG...`\n"); +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + printf(" --disable-bounds-checks Disable bounds checks for memory accesses\n"); #endif - printf(" --repl Start a very simple REPL (read-eval-print-loop) mode\n" - " that runs commands in the form of `FUNC ARG...`\n"); #if WASM_ENABLE_LIBC_WASI != 0 libc_wasi_print_help(); #endif #if WASM_ENABLE_MULTI_MODULE != 0 - printf(" --module-path= Indicate a module search path. default is current\n" - " directory('./')\n"); + printf(" --module-path= Indicate a module search path. default is current\n" + " directory('./')\n"); #endif #if WASM_ENABLE_LIB_PTHREAD != 0 || WASM_ENABLE_LIB_WASI_THREADS != 0 - printf(" --max-threads=n Set maximum thread number per cluster, default is 4\n"); + printf(" --max-threads=n Set maximum thread number per cluster, default is 4\n"); #endif #if WASM_ENABLE_DEBUG_INTERP != 0 - printf(" -g=ip:port Set the debug sever address, default is debug disabled\n"); + printf(" -g=ip:port Set the debug sever address, default is debug disabled\n"); printf(" if port is 0, then a random port will be used\n"); #endif - printf(" --version Show version information\n"); + printf(" --version Show version information\n"); return 1; } /* clang-format on */ @@ -190,6 +197,9 @@ static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE] = { 0 }; #else static void * malloc_func( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#endif #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif @@ -200,6 +210,9 @@ malloc_func( static void * realloc_func( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, bool full_size_mmaped, +#endif #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif @@ -210,6 +223,9 @@ realloc_func( static void free_func( +#if WASM_MEM_ALLOC_WITH_USAGE != 0 + mem_alloc_usage_t usage, +#endif #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 void *user_data, #endif @@ -228,6 +244,7 @@ handle_module_path(const char *module_path) } static char *module_search_path = "."; + static bool module_reader_callback(package_type_t module_type, const char *module_name, uint8 **p_buffer, uint32 *p_size) @@ -283,6 +300,14 @@ main(int argc, char *argv[]) #else uint32 heap_size = 16 * 1024; #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + SharedHeapInitArgs shared_heap_init_args; + uint32 shared_heap_size = 0; + void *shared_heap = NULL; +#endif +#if WASM_ENABLE_FAST_JIT != 0 + uint32 jit_code_cache_size = FAST_JIT_DEFAULT_CODE_CACHE_SIZE; +#endif #if WASM_ENABLE_GC != 0 uint32 gc_heap_size = GC_HEAP_SIZE_DEFAULT; #endif @@ -294,12 +319,16 @@ main(int argc, char *argv[]) wasm_module_inst_t wasm_module_inst = NULL; RunningMode running_mode = 0; RuntimeInitArgs init_args; + struct InstantiationArgs2 *inst_args; char error_buf[128] = { 0 }; #if WASM_ENABLE_LOG != 0 int log_verbose_level = 2; #endif bool is_repl_mode = false; bool is_xip_file = false; +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + bool disable_bounds_checks = false; +#endif #if WASM_ENABLE_LIBC_WASI != 0 libc_wasi_parse_context_t wasi_parse_ctx; #endif @@ -351,6 +380,11 @@ main(int argc, char *argv[]) else if (!strcmp(argv[0], "--repl")) { is_repl_mode = true; } +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + else if (!strcmp(argv[0], "--disable-bounds-checks")) { + disable_bounds_checks = true; + } +#endif else if (!strncmp(argv[0], "--stack-size=", 13)) { if (argv[0][13] == '\0') return print_help(); @@ -361,13 +395,6 @@ main(int argc, char *argv[]) return print_help(); heap_size = atoi(argv[0] + 12); } -#if WASM_ENABLE_GC != 0 - else if (!strncmp(argv[0], "--gc-heap-size=", 15)) { - if (argv[0][15] == '\0') - return print_help(); - gc_heap_size = atoi(argv[0] + 15); - } -#endif #if WASM_ENABLE_SHARED_HEAP != 0 else if (!strncmp(argv[0], "--shared-heap-size=", 19)) { if (argv[0][19] == '\0') @@ -375,6 +402,20 @@ main(int argc, char *argv[]) shared_heap_size = atoi(argv[0] + 19); } #endif +#if WASM_ENABLE_FAST_JIT != 0 + else if (!strncmp(argv[0], "--jit-codecache-size=", 21)) { + if (argv[0][21] == '\0') + return print_help(); + jit_code_cache_size = atoi(argv[0] + 21); + } +#endif +#if WASM_ENABLE_GC != 0 + else if (!strncmp(argv[0], "--gc-heap-size=", 15)) { + if (argv[0][15] == '\0') + return print_help(); + gc_heap_size = atoi(argv[0] + 15); + } +#endif #if WASM_ENABLE_JIT != 0 else if (!strncmp(argv[0], "--llvm-jit-size-level=", 22)) { if (argv[0][22] == '\0') @@ -408,7 +449,8 @@ main(int argc, char *argv[]) } #endif #if WASM_ENABLE_MULTI_MODULE != 0 - else if (!strncmp(argv[0], MODULE_PATH, strlen(MODULE_PATH))) { + else if (!strncmp(argv[0], + "--module-path=", strlen("--module-path="))) { module_search_path = handle_module_path(argv[0]); if (!strlen(module_search_path)) { return print_help(); @@ -440,6 +482,8 @@ main(int argc, char *argv[]) wasm_runtime_get_version(&major, &minor, &patch); printf("iwasm %" PRIu32 ".%" PRIu32 ".%" PRIu32 "\n", major, minor, patch); + printf("\n"); + wasm_proposal_print_status(); return 0; } else { @@ -485,6 +529,10 @@ main(int argc, char *argv[]) init_args.mem_alloc_option.allocator.free_func = free_func; #endif +#if WASM_ENABLE_FAST_JIT != 0 + init_args.fast_jit_code_cache_size = jit_code_cache_size; +#endif + #if WASM_ENABLE_GC != 0 init_args.gc_heap_size = gc_heap_size; #endif @@ -554,28 +602,27 @@ main(int argc, char *argv[]) libc_wasi_init(wasm_module, argc, argv, &wasi_parse_ctx); #endif + if (!wasm_runtime_instantiation_args_create(&inst_args)) { + printf("failed to create instantiate args\n"); + goto fail3; + } + wasm_runtime_instantiation_args_set_default_stack_size(inst_args, + stack_size); + wasm_runtime_instantiation_args_set_host_managed_heap_size(inst_args, + heap_size); + /* instantiate the module */ - if (!(wasm_module_inst = - wasm_runtime_instantiate(wasm_module, stack_size, heap_size, - error_buf, sizeof(error_buf)))) { + wasm_module_inst = wasm_runtime_instantiate_ex2( + wasm_module, inst_args, error_buf, sizeof(error_buf)); + wasm_runtime_instantiation_args_destroy(inst_args); + if (!wasm_module_inst) { printf("%s\n", error_buf); goto fail3; } -#if WASM_ENABLE_SHARED_HEAP != 0 - if (shared_heap_size > 0) { - memset(&shared_heap_init_args, 0, sizeof(shared_heap_init_args)); - shared_heap_init_args.size = shared_heap_size; - shared_heap = wasm_runtime_create_shared_heap(&shared_heap_init_args); - - if (!shared_heap) { - printf("Create shared heap failed.\n"); - goto fail5; - } - if (!wasm_runtime_attach_shared_heap(wasm_module_inst, shared_heap)) { - printf("Attach shared heap failed.\n"); - goto fail5; - } +#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 + if (disable_bounds_checks) { + wasm_runtime_set_bounds_checks(wasm_module_inst, false); } #endif @@ -596,6 +643,25 @@ main(int argc, char *argv[]) } #endif +#if WASM_ENABLE_SHARED_HEAP != 0 + if (shared_heap_size > 0) { + memset(&shared_heap_init_args, 0, sizeof(shared_heap_init_args)); + shared_heap_init_args.size = shared_heap_size; + shared_heap = wasm_runtime_create_shared_heap(&shared_heap_init_args); + + if (!shared_heap) { + printf("Create preallocated shared heap failed\n"); + goto fail6; + } + + /* attach module instance to the shared heap */ + if (!wasm_runtime_attach_shared_heap(wasm_module_inst, shared_heap)) { + printf("Attach shared heap failed.\n"); + goto fail6; + } + } +#endif + ret = 0; const char *exception = NULL; if (is_repl_mode) { @@ -627,8 +693,11 @@ main(int argc, char *argv[]) printf("%s\n", exception); #if WASM_ENABLE_SHARED_HEAP != 0 -fail5: +fail6: #endif + + /* fail5: label is used by posix/main.c */ + #if WASM_ENABLE_DEBUG_INTERP != 0 fail4: #endif diff --git a/product-mini/platforms/zephyr/simple-file/CMakeLists.txt b/product-mini/platforms/zephyr/simple-file/CMakeLists.txt new file mode 100644 index 0000000000..409bafa4d7 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/CMakeLists.txt @@ -0,0 +1,91 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required(VERSION 3.8.2) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(wamr) + +enable_language (ASM) + +set (WAMR_BUILD_PLATFORM "zephyr") + +# WAMR Configuration: +set (WAMR_BUILD_TARGET "THUMB") +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_LIBC_BUILTIN 1) # printf +set (WAMR_BUILD_LIBC_WASI 1) +set (WAMR_BUILD_LIB_PTHREAD 0) +set (WAMR_BUILD_GLOBAL_HEAP_POOL 1) +set (WAMR_BUILD_GLOBAL_HEAP_SIZE 131072) # 128 KB +# set (WAMR_BUILD_GLOBAL_HEAP_SIZE 65536) # 64 KB + +# Environment variables: + +# Check if WAMR_ROOT_DIR is set +if(DEFINED ENV{WAMR_ROOT_DIR}) + set(WAMR_ROOT_DIR $ENV{WAMR_ROOT_DIR}) +else() + message(FATAL_ERROR "'WAMR_ROOT_DIR' need to be specified") +endif() +message("wasi-sdk was found at ${WAMR_ROOT_DIR}") + +# Check if WASI_SDK_PATH is set +if(NOT $ENV{WASI_SDK_PATH} STREQUAL "") + set(WASI_SDK_PATH $ENV{WASI_SDK_PATH}) +else() + find_program(WASM_C_COMPILER clang /opt/wasi-sdk/bin NO_DEFAULT_PATH) + if(NOT WASM_C_COMPILER) + message(FATAL_ERROR "'wasi-sdk' not found, please ensure wasi-sdk is installed.\ + You can download and install it from\ + https://github.com/WebAssembly/wasi-sdk/releases") + else() + set(WASI_SDK_PATH /opt/wasi-sdk) + endif() +endif() +message("wasi-sdk was found at ${WASI_SDK_PATH}") + +# Check if WAMR_APP_FRAMEWORK_DIR is set +if (DEFINED ENV{WAMR_APP_FRAMEWORK_DIR}) + set(WAMR_APP_FRAMEWORK_DIR $ENV{WAMR_APP_FRAMEWORK_DIR}) +else() + message(FATAL_ERROR "'wamr-app-framework' not found, please ensure they are installed.\ + You can download and install them from\ + https://github.com/bytecodealliance/wamr-app-framework") +endif() +message("wamr-app-framework was found at ${WAMR_APP_FRAMEWORK_DIR}") + +# set the WAMR_SDK_DIR with the path specified in the environment variable +set(WAMR_SDK_DIR + ${WAMR_APP_FRAMEWORK_DIR}/wamr-sdk +) + +# set the WAMR_LIBC_BUILTIN_DIR +set(WAMR_LIBC_BUILTIN_DIR + ${WAMR_SDK_DIR}/wamr-sdk/app/libc-builtin-sysroot +) + +# set the WAMR_SDK_PACKAGE_OUT_DIR +set(WAMR_SDK_PACKAGE_OUT_DIR + ${CMAKE_CURRENT_BINARY_DIR}/wamr-sdk/app-sdk/wamr-app-framework +) + +# # Reset linker flags +# set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +# set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) +# include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) # in socket-api sample + +# Build the WAMR runtime +target_sources(app PRIVATE + ${WAMR_RUNTIME_LIB_SOURCE} + src/main.c) + +# Link libraries like in samples. +set(WASI_LIBM "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libm.a") +set(WASI_LIBDL "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libdl.a") + +target_link_libraries(app PUBLIC ${WASI_LIBM} ${WASI_LIBDL}) \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/README.md b/product-mini/platforms/zephyr/simple-file/README.md new file mode 100644 index 0000000000..a00aecb3a1 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/README.md @@ -0,0 +1,91 @@ +# File sample +This sample demonstrates the use of WASI API to interact with the file system. + +> 🛠️ **Work in progress:** The sample is functional but be aware that just a small part of WASI File System API was tested. +> Actual Zephyr APIs: +> * directory creation = `fs_mkdir` +> * file opening/creation = `fs_open` +> * file write = `fs_write` +> * file offset = `fs_seek` +> * file read = `fs_read` +> * file close = `fs_close` +> * directory close = `fs_closedir` + +## Run Command +* **Zephyr Build** + 1. **Build:** Replace `nucleo_h743zi` with your board name and the `WAMR_BUILD_TARGET` in `CMakeList.txt` with your target architecture. + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr \ + WAMR_ROOT_DIR=~/wasm-micro-runtime \ + WASI_SDK_PATH=~/wasi-sdk-21.0 \ + WAMR_APP_FRAMEWORK_DIR=~/wamr-app-framework \ + west build . -b nucleo_h563zi -p always + ``` + ⚠️ **Warning:** The flags `ZEPHYR_BASE`, `WAMR_ROOT_DIR`, `WASI_SDK_PATH`, and `WAMR_APP_FRAMEWORK_DIR` need to be set otherwise the build will fail. + + 2. **Flash:** + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr west flash + ``` + + 3. **Monitor:** Use a serial link to monitor the output. Personally, I use minicom. + ```bash + minicom -D /dev/ttyACM0 + ``` + + 4. **Debug:** Curently investigating. + +* **WebAssembly Module** + + ❗ **Important:** I used wasi-sdk 21 to compile the module. I still haven't tried the module with the new wasi-sdk 22. + + 1. **Compile:** in the `wasm-apps` folder. + ```bash + ~/wasi-sdk-21.0/bin/clang --sysroot=/home/user/wasi-sdk-21.0/share/wasi-sysroot -nodefaultlibs -lc -o file.wasm file.c -z stack-size=8192 -Wl,--initial-memory=65536 -Wl,--export=__heap_base -Wl,--export=__data_end + ``` + 2. **generate a C header:** Use `xxd` or other tool, I also put simple python script. At application root `simple-file/`. + ```bash + python3 to_c_header.py + ``` + Be free to modify the script to fit your needs. + +## Output +The output should be similar to the following: +```bash +*** Booting Zephyr OS build v3.6.0-4305-g2ec8f442a505 *** +Area 3 at 0x1f0000 on flash-controller@40022000 for 65536 bytes +[00:00:00.067,000] littlefs: LittleFS version 2.8, disk version 2.1 +[00:00:00.074,000] littlefs: FS at flash-controller@40022000:0x1f0000 is 8 0x2000-byte blocks with 512 cycle +[00:00:00.085,000] littlefs: sizes: rd 16 ; pr 16 ; ca 64 ; la 32 +[00:00:00.092,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:1351: Corrupted dir pair at {0x0, 0x1} +[00:00:00.103,000] littlefs: can't mount (LFS -84); formatting +[00:00:00.114,000] littlefs: /lfs mounted +/lfs mount: 0 +[00:00:00.120,000] main: stdin = 0 +[00:00:00.124,000] main: stdout = 1 +[00:00:00.128,000] main: stderr = 2 +[00:00:00.133,000] main: global heap size: 131072 +[00:00:00.142,000] main: Wasm file size: 34682 +[00:00:00:000 - 2000AFE0]: WASI context initialization: START + +[OS] os_rwlock_init +[OS] os_rwlock_init +[00:00:00:000 - 2000AFE0]: WASI context initialization: END + +[00:00:00.190,000] main: main found +Hello WebAssembly Module ! + +mkdir returned 0 +fopen Succeed +fwrite returned 13 +fseek returned 0 +fread returned 13 +buffer read = Hello, World! + +[00:00:00.225,000] main: main executed +[00:00:00.230,000] main: wasi exit code: 0 +[00:00:00.239,000] main: elapsed: 178ms +[00:00:03.158,000] phy_mii: PHY (0) Link speed 100 Mb, full duplex + +[00:00:00.051,000] phy_mii: PHY (0) ID 7C131 +``` \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/prj.conf b/product-mini/platforms/zephyr/simple-file/prj.conf new file mode 100644 index 0000000000..ca9d2fc373 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/prj.conf @@ -0,0 +1,40 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Log config +CONFIG_PRINTK=y +CONFIG_LOG=y +CONFIG_LOG_MODE_IMMEDIATE=y +# CONFIG_LOG_MODE_DEFERRED=y + +CONFIG_MAIN_STACK_SIZE=8192 +# CONFIG_HEAP_MEM_POOL_SIZE=32768 +CONFIG_REQUIRES_FULL_LIBC=y + +# Config File System +CONFIG_POSIX_API=n +CONFIG_FILE_SYSTEM=y +CONFIG_FILE_SYSTEM_LITTLEFS=y +# CONFIG_FS_LITTLEFS_BLK_DEV=y + +# Temp Build Network stack to compile. +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_IPV6=y +CONFIG_NET_TCP=y +CONFIG_NET_SOCKETS=y + + +# Random generator +CONFIG_TEST_RANDOM_GENERATOR=y + +# Stack conf +CONFIG_STACK_SENTINEL=y +CONFIG_HW_STACK_PROTECTION=y + +# Flash +CONFIG_FLASH=y +CONFIG_FLASH_MAP=y + +# Debug +CONFIG_DEBUG=y \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/src/file.h b/product-mini/platforms/zephyr/simple-file/src/file.h new file mode 100644 index 0000000000..eba5266809 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/src/file.h @@ -0,0 +1,2898 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +unsigned char __aligned(4) wasm_test_file[] = { + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x6b, 0x0f, 0x60, + 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, + 0x7e, 0x60, 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, + 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7e, + 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x09, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x00, + 0x60, 0x05, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x01, + 0x7f, 0x60, 0x08, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x01, + 0x7f, 0x60, 0x02, 0x7c, 0x7f, 0x01, 0x7c, 0x60, 0x03, 0x7f, 0x7f, 0x7f, + 0x00, 0x60, 0x05, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x02, 0xef, 0x03, + 0x0d, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x08, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x03, 0x16, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, + 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, + 0x74, 0x00, 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x31, 0x08, 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x00, + 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x0d, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x67, + 0x65, 0x74, 0x00, 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x13, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x00, + 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x0e, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, + 0x67, 0x65, 0x74, 0x00, 0x03, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x13, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x07, 0x66, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x00, 0x04, 0x16, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x07, 0x66, + 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x00, 0x05, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x66, 0x64, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x00, 0x04, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x15, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x00, 0x06, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, + 0x74, 0x00, 0x07, 0x03, 0x57, 0x56, 0x08, 0x09, 0x08, 0x02, 0x02, 0x07, + 0x07, 0x03, 0x07, 0x0a, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x00, 0x04, + 0x05, 0x04, 0x03, 0x0b, 0x07, 0x08, 0x02, 0x08, 0x08, 0x00, 0x00, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x0a, 0x08, 0x08, 0x02, + 0x00, 0x04, 0x03, 0x03, 0x02, 0x00, 0x03, 0x00, 0x03, 0x0c, 0x03, 0x00, + 0x09, 0x0d, 0x0e, 0x08, 0x03, 0x00, 0x02, 0x08, 0x03, 0x04, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, + 0x03, 0x00, 0x02, 0x04, 0x02, 0x07, 0x02, 0x03, 0x04, 0x05, 0x01, 0x70, + 0x01, 0x06, 0x06, 0x05, 0x03, 0x01, 0x00, 0x01, 0x06, 0x1a, 0x04, 0x7f, + 0x01, 0x41, 0x80, 0xeb, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x7f, + 0x00, 0x41, 0x80, 0xeb, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0xfc, 0x2a, 0x0b, + 0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, + 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0f, 0x0b, 0x5f, 0x5f, + 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x03, 0x02, 0x0a, + 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x64, 0x03, 0x03, + 0x09, 0x0b, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x05, 0x2e, 0x2c, 0x30, 0x32, + 0x58, 0x0a, 0xe0, 0xe2, 0x01, 0x56, 0x02, 0x00, 0x0b, 0x03, 0x00, 0x00, + 0x0b, 0x52, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xb0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, + 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xb0, 0x9e, + 0x80, 0x80, 0x00, 0x6a, 0x41, 0x01, 0x36, 0x02, 0x00, 0x10, 0x8d, 0x80, + 0x80, 0x80, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x10, + 0xa7, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x0f, 0x0b, 0x00, + 0x00, 0x0b, 0x20, 0x00, 0x10, 0xa3, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x0a, 0x00, 0x20, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xab, + 0x32, 0x01, 0x0b, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, + 0x6b, 0x22, 0x01, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xd0, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, + 0x28, 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, + 0x00, 0x42, 0x7f, 0x37, 0x02, 0x9c, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x37, 0x02, 0x94, + 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x41, + 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, 0xaa, 0x05, 0x73, 0x22, 0x03, 0x36, + 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, + 0xa4, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xf4, + 0xa1, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, + 0x80, 0xeb, 0x80, 0x80, 0x00, 0x49, 0x0d, 0x01, 0x41, 0x00, 0x21, 0x02, + 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, + 0x6b, 0x41, 0xd9, 0x00, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, + 0x00, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x36, 0x02, 0xf8, 0xa1, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x36, 0x02, + 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0xdc, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x7f, 0x36, 0x02, 0xd8, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, + 0x80, 0xeb, 0x80, 0x80, 0x00, 0x6b, 0x36, 0x02, 0xfc, 0xa1, 0x80, 0x80, + 0x00, 0x03, 0x40, 0x20, 0x04, 0x41, 0xf4, 0x9e, 0x80, 0x80, 0x00, 0x6a, + 0x20, 0x04, 0x41, 0xe8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xec, 0x9e, 0x80, + 0x80, 0x00, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xfc, + 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xf0, 0x9e, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x41, 0x84, 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x20, + 0x04, 0x41, 0xf8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x80, + 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, + 0x41, 0x20, 0x6a, 0x22, 0x04, 0x41, 0x80, 0x02, 0x47, 0x0d, 0x00, 0x0b, + 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x41, 0x78, 0x41, 0x80, 0xeb, 0x80, + 0x80, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x02, 0x41, + 0x04, 0x6a, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0x80, 0xeb, 0x80, + 0x80, 0x00, 0x6b, 0x41, 0x48, 0x6a, 0x22, 0x03, 0x20, 0x04, 0x6b, 0x22, + 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, 0xd4, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x20, + 0x03, 0x41, 0x80, 0xeb, 0x80, 0x80, 0x00, 0x6a, 0x41, 0x04, 0x6a, 0x41, + 0x38, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, + 0xec, 0x01, 0x4b, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x06, 0x41, 0x10, 0x20, 0x00, 0x41, 0x13, + 0x6a, 0x41, 0x70, 0x71, 0x20, 0x00, 0x41, 0x0b, 0x49, 0x1b, 0x22, 0x07, + 0x41, 0x03, 0x76, 0x22, 0x03, 0x76, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, 0x01, 0x71, 0x20, + 0x03, 0x72, 0x41, 0x01, 0x73, 0x22, 0x05, 0x41, 0x03, 0x74, 0x22, 0x03, + 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x04, 0x20, 0x03, 0x41, + 0xe8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x28, + 0x02, 0x08, 0x22, 0x07, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, 0x41, + 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, + 0x20, 0x04, 0x36, 0x02, 0x0c, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, + 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, 0x03, 0x74, 0x22, 0x05, 0x41, 0x03, + 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x05, 0x6a, 0x22, 0x03, 0x20, + 0x03, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x12, + 0x0b, 0x20, 0x07, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x08, 0x4d, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x03, 0x74, 0x41, 0x02, 0x20, + 0x03, 0x74, 0x22, 0x04, 0x41, 0x00, 0x20, 0x04, 0x6b, 0x72, 0x71, 0x68, + 0x22, 0x03, 0x41, 0x03, 0x74, 0x22, 0x04, 0x41, 0xe0, 0x9e, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x05, 0x20, 0x04, 0x41, 0xe8, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x28, 0x02, 0x08, 0x22, 0x00, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, 0x41, 0x7e, 0x20, 0x03, 0x77, 0x71, + 0x22, 0x06, 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, + 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x20, 0x05, 0x36, + 0x02, 0x0c, 0x0b, 0x20, 0x04, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x04, 0x20, 0x03, 0x41, 0x03, 0x74, 0x22, 0x03, 0x6a, 0x20, + 0x03, 0x20, 0x07, 0x6b, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, + 0x07, 0x6a, 0x22, 0x00, 0x20, 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x02, 0x40, 0x20, 0x08, 0x45, 0x0d, 0x00, 0x20, 0x08, 0x41, 0x78, 0x71, + 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x07, 0x41, 0x00, 0x28, + 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x06, 0x41, 0x01, 0x20, 0x08, 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, + 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, 0x20, 0x09, 0x72, 0x36, 0x02, + 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x07, 0x21, 0x09, 0x0c, 0x01, 0x0b, + 0x20, 0x07, 0x28, 0x02, 0x08, 0x21, 0x09, 0x0b, 0x20, 0x09, 0x20, 0x03, + 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, + 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x09, 0x36, 0x02, 0x08, + 0x0b, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x41, 0x00, 0x20, 0x00, + 0x36, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, + 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x12, 0x0b, 0x41, 0x00, 0x28, + 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x0a, 0x45, 0x0d, 0x01, 0x20, + 0x0a, 0x68, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, + 0x07, 0x6b, 0x21, 0x03, 0x20, 0x00, 0x21, 0x05, 0x02, 0x40, 0x03, 0x40, + 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, 0x10, 0x22, 0x04, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x02, + 0x0b, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, + 0x22, 0x05, 0x20, 0x03, 0x20, 0x05, 0x20, 0x03, 0x49, 0x22, 0x05, 0x1b, + 0x21, 0x03, 0x20, 0x04, 0x20, 0x00, 0x20, 0x05, 0x1b, 0x21, 0x00, 0x20, + 0x04, 0x21, 0x05, 0x0c, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x18, + 0x21, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x22, 0x09, 0x20, + 0x00, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x04, 0x41, + 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x49, 0x1a, 0x20, 0x09, + 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x0c, + 0x0c, 0x11, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, + 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x10, + 0x22, 0x04, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, + 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, 0x02, 0x20, 0x04, 0x22, 0x09, 0x41, + 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, + 0x09, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, + 0x04, 0x0d, 0x00, 0x0b, 0x20, 0x02, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, + 0x10, 0x0b, 0x41, 0x7f, 0x21, 0x07, 0x20, 0x00, 0x41, 0xbf, 0x7f, 0x4b, + 0x0d, 0x00, 0x20, 0x00, 0x41, 0x13, 0x6a, 0x22, 0x04, 0x41, 0x70, 0x71, + 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x22, + 0x0b, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x08, 0x02, 0x40, 0x20, 0x07, + 0x41, 0x80, 0x02, 0x49, 0x0d, 0x00, 0x41, 0x1f, 0x21, 0x08, 0x20, 0x07, + 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x07, 0x41, 0x26, + 0x20, 0x04, 0x41, 0x08, 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, + 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x08, + 0x0b, 0x41, 0x00, 0x20, 0x07, 0x6b, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x08, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, + 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x05, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, 0x09, 0x0c, 0x01, 0x0b, 0x41, 0x00, + 0x21, 0x04, 0x20, 0x07, 0x41, 0x00, 0x41, 0x19, 0x20, 0x08, 0x41, 0x01, + 0x76, 0x6b, 0x20, 0x08, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x00, 0x41, + 0x00, 0x21, 0x09, 0x03, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, 0x06, 0x20, 0x03, 0x4f, 0x0d, + 0x00, 0x20, 0x06, 0x21, 0x03, 0x20, 0x05, 0x21, 0x09, 0x20, 0x06, 0x0d, + 0x00, 0x41, 0x00, 0x21, 0x03, 0x20, 0x05, 0x21, 0x09, 0x20, 0x05, 0x21, + 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x41, 0x14, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x06, 0x20, 0x06, 0x20, 0x05, 0x20, 0x00, 0x41, 0x1d, + 0x76, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x05, 0x46, 0x1b, 0x20, 0x04, 0x20, 0x06, 0x1b, 0x21, 0x04, 0x20, 0x00, + 0x41, 0x01, 0x74, 0x21, 0x00, 0x20, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x02, + 0x40, 0x20, 0x04, 0x20, 0x09, 0x72, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x09, + 0x41, 0x02, 0x20, 0x08, 0x74, 0x22, 0x04, 0x41, 0x00, 0x20, 0x04, 0x6b, + 0x72, 0x20, 0x0b, 0x71, 0x22, 0x04, 0x45, 0x0d, 0x03, 0x20, 0x04, 0x68, + 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, + 0x00, 0x21, 0x04, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, + 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, + 0x06, 0x20, 0x03, 0x49, 0x21, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, + 0x10, 0x22, 0x05, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x14, 0x6a, 0x28, 0x02, + 0x00, 0x21, 0x05, 0x0b, 0x20, 0x06, 0x20, 0x03, 0x20, 0x00, 0x1b, 0x21, + 0x03, 0x20, 0x04, 0x20, 0x09, 0x20, 0x00, 0x1b, 0x21, 0x09, 0x20, 0x05, + 0x21, 0x04, 0x20, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x09, 0x45, 0x0d, + 0x00, 0x20, 0x03, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x20, 0x07, 0x6b, 0x4f, 0x0d, 0x00, 0x20, 0x09, 0x28, 0x02, 0x18, 0x21, + 0x02, 0x02, 0x40, 0x20, 0x09, 0x28, 0x02, 0x0c, 0x22, 0x00, 0x20, 0x09, + 0x46, 0x0d, 0x00, 0x20, 0x09, 0x28, 0x02, 0x08, 0x22, 0x04, 0x41, 0x00, + 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x49, 0x1a, 0x20, 0x00, 0x20, + 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, + 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x09, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, + 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, + 0x04, 0x45, 0x0d, 0x04, 0x20, 0x09, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, + 0x03, 0x40, 0x20, 0x05, 0x21, 0x06, 0x20, 0x04, 0x22, 0x00, 0x41, 0x14, + 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, + 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x0e, + 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x04, 0x20, 0x07, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xcc, + 0x9e, 0x80, 0x80, 0x00, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, + 0x20, 0x07, 0x6b, 0x22, 0x05, 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x20, 0x04, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, + 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x21, 0x00, 0x41, 0x00, 0x21, 0x05, + 0x0b, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x20, + 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x05, 0x20, 0x07, + 0x4d, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x07, 0x6a, 0x22, 0x04, 0x20, 0x05, + 0x20, 0x07, 0x6b, 0x22, 0x03, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, + 0x00, 0x20, 0x04, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x03, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x02, 0x20, + 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x02, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, + 0x02, 0x98, 0xa2, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x42, 0x7f, 0x37, 0x02, 0x9c, 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x37, 0x02, 0x94, + 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x41, + 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, 0xaa, 0x05, 0x73, 0x36, 0x02, 0x90, + 0xa2, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xa4, 0xa2, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xf4, 0xa1, 0x80, + 0x80, 0x00, 0x41, 0x80, 0x80, 0x04, 0x21, 0x03, 0x0b, 0x41, 0x00, 0x21, + 0x04, 0x02, 0x40, 0x20, 0x03, 0x20, 0x07, 0x41, 0xc7, 0x00, 0x6a, 0x22, + 0x08, 0x6a, 0x22, 0x00, 0x41, 0x00, 0x20, 0x03, 0x6b, 0x22, 0x06, 0x71, + 0x22, 0x09, 0x20, 0x07, 0x4b, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x30, 0x36, + 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xf0, 0xa1, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xa1, 0x80, 0x80, 0x00, + 0x22, 0x03, 0x20, 0x09, 0x6a, 0x22, 0x0b, 0x20, 0x03, 0x4d, 0x0d, 0x00, + 0x20, 0x0b, 0x20, 0x04, 0x4d, 0x0d, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x04, + 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, + 0x10, 0x0b, 0x41, 0x00, 0x2d, 0x00, 0xf4, 0xa1, 0x80, 0x80, 0x00, 0x41, + 0x04, 0x71, 0x0d, 0x05, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, + 0x45, 0x0d, 0x00, 0x41, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, 0x22, 0x03, 0x20, 0x02, + 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, 0x20, + 0x02, 0x4b, 0x0d, 0x03, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, + 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x06, 0x20, 0x09, 0x21, 0x06, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa2, 0x80, 0x80, 0x00, 0x22, 0x04, + 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x20, 0x00, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x09, 0x20, 0x00, 0x6b, 0x20, 0x03, 0x20, 0x00, 0x6a, 0x41, 0x00, 0x20, + 0x04, 0x6b, 0x71, 0x6a, 0x21, 0x06, 0x0b, 0x20, 0x06, 0x20, 0x07, 0x4d, + 0x0d, 0x06, 0x20, 0x06, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, + 0x06, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xf0, 0xa1, 0x80, 0x80, 0x00, + 0x22, 0x04, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xa1, 0x80, + 0x80, 0x00, 0x22, 0x03, 0x20, 0x06, 0x6a, 0x22, 0x05, 0x20, 0x03, 0x4d, + 0x0d, 0x07, 0x20, 0x05, 0x20, 0x04, 0x4b, 0x0d, 0x07, 0x0b, 0x20, 0x06, + 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x22, 0x04, 0x20, 0x00, 0x47, 0x0d, + 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x00, 0x20, 0x05, 0x6b, 0x20, 0x06, 0x71, + 0x22, 0x06, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x05, 0x20, + 0x06, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x20, 0x04, 0x28, + 0x02, 0x00, 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, 0x46, 0x0d, 0x04, 0x20, + 0x00, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x20, 0x07, 0x41, 0xc8, + 0x00, 0x6a, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x7f, 0x46, 0x0d, 0x00, + 0x02, 0x40, 0x20, 0x08, 0x20, 0x06, 0x6b, 0x41, 0x00, 0x28, 0x02, 0x98, + 0xa2, 0x80, 0x80, 0x00, 0x22, 0x03, 0x6a, 0x41, 0x00, 0x20, 0x03, 0x6b, + 0x71, 0x22, 0x03, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4d, 0x0d, 0x00, + 0x20, 0x04, 0x21, 0x00, 0x0c, 0x08, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x10, + 0xa5, 0x80, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x06, 0x6a, 0x21, 0x06, 0x20, 0x04, 0x21, 0x00, 0x0c, 0x08, 0x0b, + 0x41, 0x00, 0x20, 0x06, 0x6b, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0c, 0x05, 0x0b, 0x20, 0x04, 0x21, 0x00, 0x20, 0x04, 0x41, 0x7f, 0x47, + 0x0d, 0x06, 0x0c, 0x04, 0x0b, 0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x09, + 0x0c, 0x0c, 0x0b, 0x41, 0x00, 0x21, 0x00, 0x0c, 0x0a, 0x0b, 0x20, 0x00, + 0x41, 0x7f, 0x47, 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xf4, 0xa1, 0x80, 0x80, 0x00, 0x41, 0x04, 0x72, 0x36, 0x02, 0xf4, 0xa1, + 0x80, 0x80, 0x00, 0x0b, 0x20, 0x09, 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, + 0x4b, 0x0d, 0x01, 0x20, 0x09, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x00, 0x41, 0x00, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x04, 0x20, + 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x41, 0x7f, 0x46, 0x0d, + 0x01, 0x20, 0x00, 0x20, 0x04, 0x4f, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x00, + 0x6b, 0x22, 0x06, 0x20, 0x07, 0x41, 0x38, 0x6a, 0x4d, 0x0d, 0x01, 0x0b, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xa1, 0x80, 0x80, 0x00, 0x20, + 0x06, 0x6a, 0x22, 0x04, 0x36, 0x02, 0xe8, 0xa1, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x20, 0x04, 0x41, 0x00, 0x28, 0x02, 0xec, 0xa1, 0x80, 0x80, 0x00, + 0x4d, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xec, 0xa1, 0x80, + 0x80, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x03, 0x45, 0x0d, + 0x00, 0x41, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, 0x40, 0x20, + 0x00, 0x20, 0x04, 0x28, 0x02, 0x00, 0x22, 0x05, 0x20, 0x04, 0x28, 0x02, + 0x04, 0x22, 0x09, 0x6a, 0x46, 0x0d, 0x02, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x22, 0x04, 0x0d, 0x00, 0x0c, 0x03, 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, 0x4f, 0x0d, 0x01, 0x0b, 0x41, 0x00, + 0x20, 0x00, 0x36, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, + 0x21, 0x04, 0x41, 0x00, 0x20, 0x06, 0x36, 0x02, 0xfc, 0xa1, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xf8, 0xa1, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x41, 0x7f, 0x36, 0x02, 0xd8, 0x9e, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, + 0xdc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0x84, + 0xa2, 0x80, 0x80, 0x00, 0x03, 0x40, 0x20, 0x04, 0x41, 0xf4, 0x9e, 0x80, + 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xe8, 0x9e, 0x80, 0x80, 0x00, 0x6a, + 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, 0x41, 0xe0, 0x9e, + 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, + 0xec, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0xfc, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xf0, + 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, 0x20, 0x05, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x84, 0x9f, 0x80, 0x80, + 0x00, 0x6a, 0x20, 0x04, 0x41, 0xf8, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0x80, 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x22, 0x04, 0x41, 0x80, 0x02, 0x47, + 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, + 0x71, 0x22, 0x04, 0x6a, 0x22, 0x03, 0x20, 0x06, 0x41, 0x48, 0x6a, 0x22, + 0x05, 0x20, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, + 0x02, 0xd4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0xd0, + 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x05, 0x6a, 0x41, 0x38, 0x36, + 0x02, 0x04, 0x0c, 0x02, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x4f, 0x0d, 0x00, + 0x20, 0x03, 0x20, 0x05, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, + 0x41, 0x08, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x78, 0x20, 0x03, 0x6b, + 0x41, 0x0f, 0x71, 0x22, 0x05, 0x6a, 0x22, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x06, 0x6a, 0x22, 0x02, 0x20, 0x05, + 0x6b, 0x22, 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x04, 0x20, + 0x09, 0x20, 0x06, 0x6a, 0x36, 0x02, 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, 0xd4, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x20, + 0x03, 0x20, 0x02, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, + 0x00, 0x22, 0x09, 0x4f, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, + 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x21, 0x09, 0x0b, 0x20, 0x00, + 0x20, 0x06, 0x6a, 0x21, 0x05, 0x41, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x21, + 0x04, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x03, 0x40, 0x20, + 0x04, 0x28, 0x02, 0x00, 0x20, 0x05, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x28, + 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, + 0x2d, 0x00, 0x0c, 0x41, 0x08, 0x71, 0x45, 0x0d, 0x01, 0x0b, 0x41, 0xf8, + 0xa1, 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x00, 0x22, 0x05, 0x20, 0x03, 0x4b, 0x0d, 0x00, 0x20, 0x05, + 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x03, 0x4b, 0x0d, + 0x03, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x04, 0x0c, 0x00, 0x0b, + 0x0b, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x04, + 0x28, 0x02, 0x04, 0x20, 0x06, 0x6a, 0x36, 0x02, 0x04, 0x20, 0x00, 0x41, + 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x22, 0x02, 0x20, 0x07, + 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x05, 0x41, 0x78, 0x20, 0x05, + 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x22, 0x06, 0x20, 0x02, 0x20, 0x07, 0x6a, + 0x22, 0x07, 0x6b, 0x21, 0x04, 0x02, 0x40, 0x20, 0x06, 0x20, 0x03, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x20, 0x07, 0x36, 0x02, 0xd0, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x20, 0x04, 0x6a, 0x22, 0x04, 0x36, 0x02, 0xc4, 0x9e, 0x80, 0x80, 0x00, + 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x08, + 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, + 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x07, 0x36, 0x02, 0xcc, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc0, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x36, 0x02, 0xc0, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x0c, + 0x08, 0x0b, 0x20, 0x06, 0x28, 0x02, 0x04, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x41, 0x01, 0x47, 0x0d, 0x06, 0x20, 0x03, 0x41, 0x78, 0x71, 0x21, 0x08, + 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x06, + 0x28, 0x02, 0x08, 0x22, 0x05, 0x20, 0x03, 0x41, 0x03, 0x76, 0x22, 0x09, + 0x41, 0x03, 0x74, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x00, + 0x46, 0x1a, 0x02, 0x40, 0x20, 0x06, 0x28, 0x02, 0x0c, 0x22, 0x03, 0x20, + 0x05, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x09, 0x77, 0x71, 0x36, 0x02, 0xb8, + 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x07, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x46, + 0x1a, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, + 0x36, 0x02, 0x0c, 0x0c, 0x06, 0x0b, 0x20, 0x06, 0x28, 0x02, 0x18, 0x21, + 0x0b, 0x02, 0x40, 0x20, 0x06, 0x28, 0x02, 0x0c, 0x22, 0x00, 0x20, 0x06, + 0x46, 0x0d, 0x00, 0x20, 0x06, 0x28, 0x02, 0x08, 0x22, 0x03, 0x20, 0x09, + 0x49, 0x1a, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, + 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, + 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x20, + 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x06, 0x41, + 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, 0x09, 0x20, + 0x03, 0x22, 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, + 0x03, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x00, + 0x28, 0x02, 0x10, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x20, 0x09, 0x41, 0x00, + 0x36, 0x02, 0x00, 0x0c, 0x04, 0x0b, 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, + 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x06, 0x41, + 0x48, 0x6a, 0x22, 0x09, 0x20, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x09, 0x6a, 0x41, 0x38, 0x36, 0x02, + 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, 0x37, 0x20, 0x05, 0x6b, 0x41, 0x0f, + 0x71, 0x6a, 0x41, 0x41, 0x6a, 0x22, 0x09, 0x20, 0x09, 0x20, 0x03, 0x41, + 0x10, 0x6a, 0x49, 0x1b, 0x22, 0x09, 0x41, 0x23, 0x36, 0x02, 0x04, 0x41, + 0x00, 0x41, 0x00, 0x28, 0x02, 0xa0, 0xa2, 0x80, 0x80, 0x00, 0x36, 0x02, + 0xd4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xc4, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, 0xd0, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, 0x10, 0x6a, 0x41, 0x00, 0x29, 0x02, + 0x80, 0xa2, 0x80, 0x80, 0x00, 0x37, 0x02, 0x00, 0x20, 0x09, 0x41, 0x00, + 0x29, 0x02, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x37, 0x02, 0x08, 0x41, 0x00, + 0x20, 0x09, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x80, 0xa2, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x06, 0x36, 0x02, 0xfc, 0xa1, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x00, 0x36, 0x02, 0xf8, 0xa1, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x36, 0x02, 0x84, 0xa2, 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, + 0x24, 0x6a, 0x21, 0x04, 0x03, 0x40, 0x20, 0x04, 0x41, 0x07, 0x36, 0x02, + 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x05, 0x49, 0x0d, + 0x00, 0x0b, 0x20, 0x09, 0x20, 0x03, 0x46, 0x0d, 0x00, 0x20, 0x09, 0x20, + 0x09, 0x28, 0x02, 0x04, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x20, 0x09, + 0x20, 0x09, 0x20, 0x03, 0x6b, 0x22, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, 0x00, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x71, 0x41, + 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, + 0x01, 0x20, 0x00, 0x41, 0x03, 0x76, 0x74, 0x22, 0x00, 0x71, 0x0d, 0x00, + 0x41, 0x00, 0x20, 0x05, 0x20, 0x00, 0x72, 0x36, 0x02, 0xb8, 0x9e, 0x80, + 0x80, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, + 0x02, 0x08, 0x21, 0x05, 0x0b, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, + 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x04, 0x36, + 0x02, 0x0c, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, + 0x41, 0x1f, 0x21, 0x04, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, + 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, + 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, + 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x20, + 0x04, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, + 0x04, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x21, + 0x05, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x09, 0x41, 0x01, 0x20, 0x04, 0x74, 0x22, 0x06, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x09, 0x20, + 0x06, 0x72, 0x36, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, + 0x05, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, + 0x03, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, + 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, + 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, + 0x09, 0x02, 0x40, 0x03, 0x40, 0x20, 0x09, 0x22, 0x05, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x00, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, + 0x76, 0x21, 0x09, 0x20, 0x04, 0x41, 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, + 0x20, 0x09, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, + 0x02, 0x00, 0x22, 0x09, 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, + 0x03, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x08, 0x0c, + 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x03, 0x36, + 0x02, 0x0c, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x41, + 0x00, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, + 0x03, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0b, 0x41, 0x00, 0x28, 0x02, 0xc4, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x04, 0x20, 0x07, 0x4d, 0x0d, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x03, 0x20, 0x07, + 0x6a, 0x22, 0x05, 0x20, 0x04, 0x20, 0x07, 0x6b, 0x22, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xc4, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xd0, 0x9e, 0x80, + 0x80, 0x00, 0x20, 0x03, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x08, 0x0b, 0x41, 0x00, + 0x21, 0x04, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, + 0x00, 0x0c, 0x07, 0x0b, 0x41, 0x00, 0x21, 0x00, 0x0b, 0x20, 0x0b, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x06, 0x20, 0x06, 0x28, 0x02, + 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, + 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, + 0x71, 0x36, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, + 0x0b, 0x41, 0x10, 0x41, 0x14, 0x20, 0x0b, 0x28, 0x02, 0x10, 0x20, 0x06, + 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x0b, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, + 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x03, 0x36, 0x02, 0x10, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, + 0x20, 0x06, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x08, 0x20, 0x04, 0x6a, + 0x21, 0x04, 0x20, 0x06, 0x20, 0x08, 0x6a, 0x22, 0x06, 0x28, 0x02, 0x04, + 0x21, 0x03, 0x0b, 0x20, 0x06, 0x20, 0x03, 0x41, 0x7e, 0x71, 0x36, 0x02, + 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, + 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, + 0x04, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x78, 0x71, + 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x05, + 0x41, 0x01, 0x20, 0x04, 0x41, 0x03, 0x76, 0x74, 0x22, 0x04, 0x71, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, 0x04, 0x72, 0x36, 0x02, 0xb8, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x03, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, + 0x28, 0x02, 0x08, 0x21, 0x04, 0x0b, 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, + 0x0c, 0x20, 0x03, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x20, 0x03, + 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0c, 0x01, + 0x0b, 0x41, 0x1f, 0x21, 0x03, 0x02, 0x40, 0x20, 0x04, 0x41, 0xff, 0xff, + 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x26, 0x20, 0x04, 0x41, + 0x08, 0x76, 0x67, 0x22, 0x03, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x03, + 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x07, + 0x20, 0x03, 0x36, 0x02, 0x1c, 0x20, 0x07, 0x42, 0x00, 0x37, 0x02, 0x10, + 0x20, 0x03, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, + 0x21, 0x05, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, + 0x00, 0x22, 0x00, 0x41, 0x01, 0x20, 0x03, 0x74, 0x22, 0x09, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x07, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x00, + 0x20, 0x09, 0x72, 0x36, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x07, + 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, + 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x04, + 0x41, 0x00, 0x41, 0x19, 0x20, 0x03, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x03, + 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x03, 0x20, 0x05, 0x28, 0x02, 0x00, + 0x21, 0x00, 0x02, 0x40, 0x03, 0x40, 0x20, 0x00, 0x22, 0x05, 0x28, 0x02, + 0x04, 0x41, 0x78, 0x71, 0x20, 0x04, 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, + 0x1d, 0x76, 0x21, 0x00, 0x20, 0x03, 0x41, 0x01, 0x74, 0x21, 0x03, 0x20, + 0x05, 0x20, 0x00, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x09, + 0x28, 0x02, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x09, 0x20, 0x07, + 0x36, 0x02, 0x00, 0x20, 0x07, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x07, + 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, + 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x07, + 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, + 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x07, 0x20, 0x05, 0x36, 0x02, 0x0c, + 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0b, 0x20, 0x02, 0x41, 0x08, + 0x6a, 0x21, 0x04, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x09, 0x20, 0x09, 0x28, 0x02, 0x1c, + 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, + 0x22, 0x04, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x00, + 0x36, 0x02, 0x00, 0x20, 0x00, 0x0d, 0x01, 0x41, 0x00, 0x20, 0x0b, 0x41, + 0x7e, 0x20, 0x05, 0x77, 0x71, 0x22, 0x0b, 0x36, 0x02, 0xbc, 0x9e, 0x80, + 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x41, 0x14, 0x20, + 0x02, 0x28, 0x02, 0x10, 0x20, 0x09, 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x02, + 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x10, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x09, 0x41, 0x14, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, + 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x18, + 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x0f, 0x4b, 0x0d, 0x00, + 0x20, 0x09, 0x20, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, + 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x09, 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, 0x03, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x00, 0x20, 0x03, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x02, + 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, + 0x78, 0x71, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, + 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, + 0x22, 0x05, 0x41, 0x01, 0x20, 0x03, 0x41, 0x03, 0x76, 0x74, 0x22, 0x03, + 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, 0x03, 0x72, 0x36, 0x02, + 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x04, 0x21, 0x03, 0x0c, 0x01, 0x0b, + 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x20, 0x00, + 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, + 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x08, + 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, 0x41, + 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x26, 0x20, + 0x03, 0x41, 0x08, 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, + 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x04, 0x0b, + 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, + 0x02, 0x10, 0x20, 0x04, 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, + 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x0b, 0x41, 0x01, 0x20, 0x04, + 0x74, 0x22, 0x07, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x00, 0x41, 0x00, 0x20, 0x0b, 0x20, 0x07, 0x72, 0x36, 0x02, 0xbc, 0x9e, + 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x00, + 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x0c, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, + 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, 0x07, 0x02, 0x40, 0x03, 0x40, 0x20, + 0x07, 0x22, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x03, 0x46, + 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, 0x76, 0x21, 0x07, 0x20, 0x04, 0x41, + 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, 0x20, 0x07, 0x41, 0x04, 0x71, 0x6a, + 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, 0x02, 0x00, 0x22, 0x07, 0x0d, 0x00, + 0x0b, 0x20, 0x06, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x05, + 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x00, + 0x20, 0x00, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x08, 0x22, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x00, + 0x36, 0x02, 0x08, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, + 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x0b, 0x20, 0x09, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x0b, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x20, 0x00, 0x28, 0x02, 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, 0xe8, + 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x47, 0x0d, + 0x00, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, 0x09, 0x0d, 0x01, + 0x41, 0x00, 0x20, 0x0a, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, + 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x0b, 0x41, 0x10, + 0x41, 0x14, 0x20, 0x0b, 0x28, 0x02, 0x10, 0x20, 0x00, 0x46, 0x1b, 0x6a, + 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, 0x09, 0x45, 0x0d, 0x01, 0x0b, 0x20, + 0x09, 0x20, 0x0b, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x10, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, + 0x10, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x00, 0x41, + 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x09, + 0x41, 0x14, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x09, + 0x36, 0x02, 0x18, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x0f, + 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x04, + 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x04, 0x6a, 0x22, + 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x07, 0x6a, 0x22, 0x05, 0x20, 0x03, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x07, 0x41, 0x03, + 0x72, 0x36, 0x02, 0x04, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x02, 0x40, 0x20, 0x08, 0x45, 0x0d, 0x00, 0x20, 0x08, 0x41, + 0x78, 0x71, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x07, 0x41, + 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x21, 0x04, 0x02, 0x40, + 0x02, 0x40, 0x41, 0x01, 0x20, 0x08, 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, + 0x20, 0x06, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x09, 0x20, 0x06, 0x72, + 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x07, 0x21, 0x09, 0x0c, + 0x01, 0x0b, 0x20, 0x07, 0x28, 0x02, 0x08, 0x21, 0x09, 0x0b, 0x20, 0x09, + 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x09, 0x36, + 0x02, 0x08, 0x0b, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xcc, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, + 0x00, 0x0b, 0x20, 0x00, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x01, + 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, + 0x0a, 0x00, 0x20, 0x00, 0x10, 0x93, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xb0, + 0x0d, 0x01, 0x07, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x02, 0x41, 0x78, 0x71, 0x22, 0x00, 0x6a, 0x21, 0x03, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x00, + 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, + 0x80, 0x00, 0x22, 0x04, 0x49, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x00, 0x6a, + 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x00, + 0x28, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x46, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x02, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, + 0x08, 0x22, 0x04, 0x20, 0x02, 0x41, 0x03, 0x76, 0x22, 0x05, 0x41, 0x03, + 0x74, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x06, 0x46, 0x1a, + 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x0c, 0x22, 0x02, 0x20, 0x04, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xb8, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0xb8, 0x9e, 0x80, + 0x80, 0x00, 0x0c, 0x05, 0x0b, 0x20, 0x02, 0x20, 0x06, 0x46, 0x1a, 0x20, + 0x02, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, + 0x0c, 0x0c, 0x04, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x18, 0x21, 0x07, 0x02, + 0x40, 0x20, 0x01, 0x28, 0x02, 0x0c, 0x22, 0x06, 0x20, 0x01, 0x46, 0x0d, + 0x00, 0x20, 0x01, 0x28, 0x02, 0x08, 0x22, 0x02, 0x20, 0x04, 0x49, 0x1a, + 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, + 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0x14, 0x6a, + 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x01, 0x28, + 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, + 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, + 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, + 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, + 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x02, 0x41, + 0x03, 0x71, 0x41, 0x03, 0x47, 0x0d, 0x02, 0x20, 0x03, 0x20, 0x02, 0x41, + 0x7e, 0x71, 0x36, 0x02, 0x04, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xc0, + 0x9e, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0f, 0x0b, 0x41, + 0x00, 0x21, 0x06, 0x0b, 0x20, 0x07, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x22, 0x04, 0x41, 0x02, + 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x02, 0x28, 0x02, + 0x00, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, + 0x06, 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x7e, 0x20, 0x04, 0x77, 0x71, 0x36, 0x02, 0xbc, 0x9e, + 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x07, 0x41, 0x10, 0x41, 0x14, + 0x20, 0x07, 0x28, 0x02, 0x10, 0x20, 0x01, 0x46, 0x1b, 0x6a, 0x20, 0x06, + 0x36, 0x02, 0x00, 0x20, 0x06, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x06, 0x20, + 0x07, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, + 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x10, 0x20, + 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, 0x41, 0x14, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x14, + 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, + 0x18, 0x0b, 0x20, 0x01, 0x20, 0x03, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x28, + 0x02, 0x04, 0x22, 0x02, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, + 0x71, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x03, 0x41, 0x00, 0x28, 0x02, 0xd0, + 0x9e, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x01, 0x36, + 0x02, 0xd0, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x6a, 0x22, 0x00, 0x36, 0x02, + 0xc4, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, + 0x80, 0x00, 0x47, 0x0d, 0x06, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xc0, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xcc, 0x9e, + 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x00, 0x28, + 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x01, 0x36, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, + 0x28, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x6a, 0x22, 0x00, + 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, + 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, + 0x36, 0x02, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x41, 0x78, 0x71, 0x20, 0x00, + 0x6a, 0x21, 0x00, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x20, 0x03, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x02, 0x41, 0x03, + 0x76, 0x22, 0x05, 0x41, 0x03, 0x74, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x06, 0x46, 0x1a, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x0c, + 0x22, 0x02, 0x20, 0x04, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, + 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x05, 0x0b, 0x20, 0x02, + 0x20, 0x06, 0x46, 0x1a, 0x20, 0x02, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, + 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x0c, 0x04, 0x0b, 0x20, 0x03, 0x28, + 0x02, 0x18, 0x21, 0x07, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x22, + 0x06, 0x20, 0x03, 0x46, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x08, 0x22, + 0x02, 0x41, 0x00, 0x28, 0x02, 0xc8, 0x9e, 0x80, 0x80, 0x00, 0x49, 0x1a, + 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, + 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x14, 0x6a, + 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x03, 0x28, + 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, + 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, + 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, + 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, + 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x71, 0x36, + 0x02, 0x04, 0x20, 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, + 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x03, + 0x0b, 0x41, 0x00, 0x21, 0x06, 0x0b, 0x20, 0x07, 0x45, 0x0d, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x03, 0x20, 0x03, 0x28, 0x02, 0x1c, 0x22, 0x04, + 0x41, 0x02, 0x74, 0x41, 0xe8, 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x02, + 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, + 0x00, 0x20, 0x06, 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xbc, + 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x04, 0x77, 0x71, 0x36, 0x02, + 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x07, 0x41, 0x10, + 0x41, 0x14, 0x20, 0x07, 0x28, 0x02, 0x10, 0x20, 0x03, 0x46, 0x1b, 0x6a, + 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x45, 0x0d, 0x01, 0x0b, 0x20, + 0x06, 0x20, 0x07, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, + 0x10, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, + 0x10, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x03, 0x41, + 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, + 0x41, 0x14, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x06, + 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, 0xcc, 0x9e, 0x80, 0x80, 0x00, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xc0, 0x9e, 0x80, 0x80, + 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x78, 0x71, 0x41, 0xe0, 0x9e, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x02, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb8, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x04, 0x41, 0x01, 0x20, 0x00, 0x41, 0x03, + 0x76, 0x74, 0x22, 0x00, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x04, 0x20, + 0x00, 0x72, 0x36, 0x02, 0xb8, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x02, 0x21, + 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x28, 0x02, 0x08, 0x21, 0x00, 0x0b, + 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01, 0x36, + 0x02, 0x08, 0x20, 0x01, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, + 0x00, 0x36, 0x02, 0x08, 0x0f, 0x0b, 0x41, 0x1f, 0x21, 0x02, 0x02, 0x40, + 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, 0x76, 0x67, 0x22, 0x02, 0x6b, 0x76, + 0x41, 0x01, 0x71, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, + 0x21, 0x02, 0x0b, 0x20, 0x01, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x01, + 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x02, 0x41, 0x02, 0x74, 0x41, 0xe8, + 0xa0, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x06, 0x41, 0x01, + 0x20, 0x02, 0x74, 0x22, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, + 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x06, 0x20, 0x03, 0x72, 0x36, 0x02, + 0xbc, 0x9e, 0x80, 0x80, 0x00, 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, 0x18, + 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x01, 0x20, 0x01, 0x36, + 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x41, 0x19, 0x20, + 0x02, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x02, 0x41, 0x1f, 0x46, 0x1b, 0x74, + 0x21, 0x02, 0x20, 0x04, 0x28, 0x02, 0x00, 0x21, 0x06, 0x02, 0x40, 0x03, + 0x40, 0x20, 0x06, 0x22, 0x04, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, + 0x00, 0x46, 0x0d, 0x01, 0x20, 0x02, 0x41, 0x1d, 0x76, 0x21, 0x06, 0x20, + 0x02, 0x41, 0x01, 0x74, 0x21, 0x02, 0x20, 0x04, 0x20, 0x06, 0x41, 0x04, + 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, 0x22, 0x06, + 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x20, 0x01, + 0x20, 0x04, 0x36, 0x02, 0x18, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x0c, + 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x22, 0x00, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x20, 0x04, + 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x01, 0x41, 0x00, 0x36, 0x02, 0x18, + 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, 0x00, 0x36, + 0x02, 0x08, 0x0b, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xd8, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x7f, 0x6a, 0x22, 0x01, 0x41, 0x7f, 0x20, 0x01, 0x1b, + 0x36, 0x02, 0xd8, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x0b, 0x6b, 0x02, 0x01, + 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0xad, 0x20, 0x01, 0xad, + 0x7e, 0x22, 0x03, 0xa7, 0x21, 0x02, 0x20, 0x01, 0x20, 0x00, 0x72, 0x41, + 0x80, 0x80, 0x04, 0x49, 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x02, 0x20, 0x03, + 0x42, 0x20, 0x88, 0xa7, 0x41, 0x00, 0x47, 0x1b, 0x21, 0x02, 0x0b, 0x02, + 0x40, 0x20, 0x02, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, + 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x10, 0xa9, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x0b, 0x0b, 0x00, 0x20, + 0x00, 0x10, 0xa3, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, + 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, + 0x41, 0x0c, 0x6a, 0x10, 0x98, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, 0x10, 0x94, 0x80, 0x80, + 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, + 0x97, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, + 0x20, 0x01, 0x10, 0xe2, 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, + 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, + 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x41, 0xc6, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, + 0xc6, 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, + 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x41, 0xc6, 0x00, 0x10, 0x95, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x92, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x01, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, + 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, + 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x0f, 0x00, 0x20, 0x00, + 0x10, 0x82, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x83, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x10, 0x84, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x85, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x13, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x10, 0x86, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, + 0x71, 0x0b, 0x15, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, + 0x10, 0x87, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x15, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x10, 0x88, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x15, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x10, 0x89, 0x80, 0x80, + 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x19, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x20, 0x01, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x10, 0x8a, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x25, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02, 0x10, 0xaa, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x03, 0x20, 0x04, 0x20, 0x05, 0x20, 0x06, 0x20, 0x07, + 0x10, 0x8b, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, + 0x0b, 0x00, 0x20, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x04, 0x00, 0x00, 0x00, 0x0b, 0x4e, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, + 0x00, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7f, 0x4c, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0x10, 0x76, 0x40, 0x00, 0x22, + 0x00, 0x41, 0x7f, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x41, + 0x10, 0x74, 0x0f, 0x0b, 0x10, 0xa4, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x10, + 0xb5, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xe6, 0x07, 0x01, 0x04, 0x7f, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, + 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, + 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, + 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, + 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, + 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, + 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, + 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, + 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x21, 0x03, 0x20, + 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, + 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, 0x6a, 0x22, 0x02, + 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, + 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x08, 0x37, 0x02, + 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x10, + 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x10, + 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, + 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, + 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x10, + 0x37, 0x02, 0x10, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x18, 0x37, 0x02, + 0x18, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, + 0x6a, 0x21, 0x05, 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, + 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x05, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, + 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, + 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, + 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, + 0x0b, 0x20, 0x02, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, + 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, + 0x20, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, + 0x6a, 0x0e, 0x03, 0x03, 0x00, 0x01, 0x07, 0x0b, 0x20, 0x04, 0x20, 0x05, + 0x28, 0x02, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x02, + 0x6a, 0x28, 0x01, 0x00, 0x36, 0x02, 0x02, 0x20, 0x04, 0x20, 0x05, 0x41, + 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, 0x20, 0x04, 0x41, 0x12, + 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, 0x01, 0x41, 0x0e, + 0x21, 0x06, 0x20, 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, 0x00, 0x21, 0x05, + 0x41, 0x0e, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, + 0x02, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x01, 0x6a, + 0x28, 0x00, 0x00, 0x36, 0x02, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x05, + 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, + 0x21, 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, + 0x06, 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, + 0x0f, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, + 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x02, 0x20, 0x05, 0x21, + 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, + 0x20, 0x05, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x05, + 0x2d, 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, + 0x02, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x08, 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, + 0x02, 0x00, 0x22, 0x02, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x02, 0x41, + 0x10, 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x02, 0x41, 0x08, 0x76, + 0x3a, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x03, 0x6a, 0x28, 0x00, + 0x00, 0x36, 0x02, 0x03, 0x20, 0x04, 0x20, 0x05, 0x41, 0x07, 0x6a, 0x29, + 0x00, 0x00, 0x37, 0x02, 0x07, 0x20, 0x04, 0x41, 0x13, 0x6a, 0x21, 0x02, + 0x20, 0x05, 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, + 0x05, 0x41, 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0d, 0x21, + 0x03, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, + 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, + 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, + 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, + 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x02, 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, + 0x02, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, + 0x20, 0x03, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x88, 0x03, + 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, + 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x20, 0x00, 0x6a, 0x22, 0x03, + 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, + 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, + 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, + 0x00, 0x20, 0x02, 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x3a, 0x00, 0x03, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, + 0x00, 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, + 0x20, 0x00, 0x6b, 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, + 0x7c, 0x71, 0x22, 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x04, + 0x20, 0x02, 0x41, 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x74, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x19, + 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x05, + 0x20, 0x03, 0x36, 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x10, + 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x41, 0x70, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, 0x6a, 0x20, 0x03, + 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x02, 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x01, 0x20, 0x05, 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, + 0x22, 0x01, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, + 0x80, 0x80, 0x80, 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, 0x20, 0x02, 0x6a, + 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x18, 0x20, + 0x02, 0x20, 0x06, 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, + 0x08, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x1f, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcc, 0x01, 0x01, 0x03, + 0x7f, 0x20, 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, 0x00, 0x41, + 0x01, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, + 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, + 0x0b, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x7b, + 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, + 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, + 0x41, 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, + 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x03, + 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x2d, 0x00, + 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x20, 0x03, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0x27, 0x00, + 0x10, 0xca, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x00, 0x10, 0x99, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, + 0x7f, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x38, 0x10, 0xab, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x71, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0xa0, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x28, 0x02, 0x0c, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x41, 0x10, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0xbb, 0x02, + 0x01, 0x07, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, + 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, + 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x03, + 0x20, 0x00, 0x28, 0x02, 0x18, 0x22, 0x01, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x01, 0x6b, 0x22, 0x04, 0x36, 0x02, + 0x04, 0x41, 0x02, 0x21, 0x05, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, + 0x02, 0x38, 0x20, 0x03, 0x41, 0x02, 0x10, 0xad, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x01, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x22, 0x06, 0x46, 0x0d, 0x00, + 0x20, 0x03, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x7f, + 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x00, 0x36, + 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00, 0x20, 0x05, + 0x41, 0x02, 0x46, 0x0d, 0x03, 0x20, 0x02, 0x20, 0x04, 0x28, 0x02, 0x04, + 0x6b, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x01, 0x20, 0x04, + 0x28, 0x02, 0x04, 0x22, 0x07, 0x4b, 0x22, 0x08, 0x41, 0x03, 0x74, 0x6a, + 0x22, 0x09, 0x20, 0x09, 0x28, 0x02, 0x00, 0x20, 0x01, 0x20, 0x07, 0x41, + 0x00, 0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x6a, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0x0c, 0x41, 0x04, 0x20, 0x08, 0x1b, 0x6a, 0x22, 0x04, 0x20, + 0x04, 0x28, 0x02, 0x00, 0x20, 0x07, 0x6b, 0x36, 0x02, 0x00, 0x20, 0x09, + 0x21, 0x04, 0x20, 0x06, 0x20, 0x01, 0x6b, 0x22, 0x06, 0x20, 0x00, 0x28, + 0x02, 0x38, 0x20, 0x09, 0x20, 0x05, 0x20, 0x08, 0x6b, 0x22, 0x05, 0x10, + 0xad, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x47, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, 0x01, 0x36, 0x02, 0x18, + 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x21, 0x01, + 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x01, 0x0b, 0x66, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x20, 0x6b, 0x22, 0x01, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x10, + 0x9a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x41, 0x3b, 0x21, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x08, 0x41, 0x02, 0x47, 0x0d, 0x00, 0x20, + 0x01, 0x2d, 0x00, 0x10, 0x41, 0x24, 0x71, 0x0d, 0x00, 0x41, 0x01, 0x21, + 0x02, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x02, 0x41, 0x00, 0x20, 0x00, + 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x20, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x02, 0x0b, 0x3b, 0x00, + 0x20, 0x00, 0x41, 0x81, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x20, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0xc0, 0x00, 0x71, 0x0d, 0x00, + 0x20, 0x00, 0x28, 0x02, 0x38, 0x10, 0xaf, 0x80, 0x80, 0x80, 0x00, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x7f, 0x36, 0x02, 0x40, 0x0b, 0x20, 0x00, 0x20, + 0x01, 0x20, 0x02, 0x10, 0xae, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x64, 0x01, + 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x20, 0x03, 0x41, + 0x08, 0x6a, 0x10, 0x9f, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, + 0x00, 0x41, 0x00, 0x41, 0xc6, 0x00, 0x20, 0x02, 0x20, 0x02, 0x41, 0xcc, + 0x00, 0x46, 0x1b, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x42, 0x7f, + 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x29, 0x03, 0x08, 0x21, 0x01, + 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x01, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x28, 0x02, 0x38, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x08, 0x00, 0x41, + 0xb8, 0xaa, 0x80, 0x80, 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x83, 0x03, 0x01, + 0x03, 0x7f, 0x02, 0x40, 0x10, 0xb3, 0x80, 0x80, 0x80, 0x00, 0x28, 0x02, + 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, + 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x34, 0x22, 0x00, 0x0d, 0x00, 0x0b, + 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0xaa, 0x80, 0x80, 0x00, + 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, + 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, + 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xb0, 0x9d, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, + 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, + 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, + 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, + 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xa8, + 0x9e, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, + 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x0b, 0x0b, 0x5c, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x3c, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x36, 0x02, 0x3c, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, + 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, 0x01, 0x36, 0x02, 0x18, + 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0xe8, + 0x01, 0x01, 0x05, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x28, 0x02, + 0x10, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x20, 0x02, 0x10, + 0xb6, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x02, 0x28, 0x02, 0x10, + 0x21, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x20, 0x02, 0x28, 0x02, 0x14, + 0x22, 0x05, 0x6b, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x20, 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x02, 0x40, 0x20, 0x02, + 0x28, 0x02, 0x40, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x06, + 0x20, 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, 0x03, 0x03, 0x40, 0x20, 0x01, + 0x20, 0x03, 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, + 0x20, 0x04, 0x41, 0x7f, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x6a, 0x22, 0x07, + 0x2d, 0x00, 0x00, 0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x02, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x03, 0x6b, 0x41, 0x01, 0x6a, 0x22, 0x06, 0x20, + 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, + 0x04, 0x20, 0x06, 0x49, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x21, + 0x01, 0x20, 0x07, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x28, 0x02, + 0x14, 0x21, 0x05, 0x0b, 0x20, 0x05, 0x20, 0x00, 0x20, 0x01, 0x10, 0xa8, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x14, + 0x20, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x06, 0x20, 0x01, 0x6a, 0x21, + 0x04, 0x0b, 0x20, 0x04, 0x0b, 0x95, 0x02, 0x01, 0x06, 0x7f, 0x20, 0x02, + 0x20, 0x01, 0x6c, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x28, + 0x02, 0x10, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x06, 0x20, 0x03, + 0x10, 0xb6, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x03, 0x28, 0x02, + 0x10, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x20, 0x03, 0x28, 0x02, + 0x14, 0x22, 0x07, 0x6b, 0x20, 0x04, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x21, 0x06, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x08, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x40, 0x41, 0x00, 0x4e, + 0x0d, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, + 0x04, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x21, 0x08, 0x41, 0x00, 0x21, 0x05, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x05, 0x6a, 0x0d, 0x00, 0x20, + 0x04, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, + 0x05, 0x20, 0x06, 0x6a, 0x22, 0x09, 0x2d, 0x00, 0x00, 0x41, 0x0a, 0x47, + 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x20, 0x04, 0x20, 0x05, 0x6a, + 0x41, 0x01, 0x6a, 0x22, 0x08, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, 0x06, 0x20, 0x08, 0x49, 0x0d, 0x01, + 0x20, 0x05, 0x41, 0x7f, 0x73, 0x21, 0x05, 0x20, 0x09, 0x41, 0x01, 0x6a, + 0x21, 0x00, 0x20, 0x03, 0x28, 0x02, 0x14, 0x21, 0x07, 0x0b, 0x20, 0x07, + 0x20, 0x00, 0x20, 0x05, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, + 0x03, 0x20, 0x03, 0x28, 0x02, 0x14, 0x20, 0x05, 0x6a, 0x36, 0x02, 0x14, + 0x20, 0x08, 0x20, 0x05, 0x6a, 0x21, 0x06, 0x0b, 0x02, 0x40, 0x20, 0x06, + 0x20, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, 0x1b, + 0x0f, 0x0b, 0x20, 0x06, 0x20, 0x01, 0x6e, 0x0b, 0x04, 0x00, 0x20, 0x00, + 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xb9, 0x80, 0x80, 0x80, + 0x00, 0x0b, 0x55, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, + 0xd8, 0xaa, 0x80, 0x80, 0x00, 0x22, 0x01, 0x0d, 0x00, 0x41, 0xc0, 0xaa, + 0x80, 0x80, 0x00, 0x21, 0x01, 0x41, 0x00, 0x41, 0xc0, 0xaa, 0x80, 0x80, + 0x00, 0x36, 0x02, 0xd8, 0xaa, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, 0x20, + 0x00, 0x20, 0x00, 0x41, 0xcc, 0x00, 0x4b, 0x1b, 0x41, 0x01, 0x74, 0x41, + 0x90, 0x94, 0x80, 0x80, 0x00, 0x6a, 0x2f, 0x01, 0x00, 0x41, 0x80, 0x88, + 0x80, 0x80, 0x00, 0x6a, 0x20, 0x01, 0x28, 0x02, 0x14, 0x10, 0xba, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0xf2, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, + 0x00, 0x47, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, + 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, + 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, + 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, + 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, + 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, + 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, + 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, + 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, + 0x01, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, + 0x03, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, + 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, + 0x84, 0x08, 0x6c, 0x21, 0x00, 0x03, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, + 0x20, 0x00, 0x73, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02, 0x41, 0xff, + 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, + 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, + 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x21, + 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x02, + 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, + 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x0d, 0x00, 0x0b, + 0x0b, 0x41, 0x00, 0x0b, 0x1a, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x41, 0x00, + 0x20, 0x01, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x20, 0x00, + 0x6b, 0x20, 0x01, 0x20, 0x02, 0x1b, 0x0b, 0xb6, 0x02, 0x01, 0x01, 0x7f, + 0x41, 0x01, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x01, 0x41, 0xff, 0x00, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x3a, 0x00, 0x00, 0x41, 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xc0, 0xaa, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x80, 0x7f, 0x71, 0x41, 0x80, 0xbf, 0x03, 0x46, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x19, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, + 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x41, + 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0xff, 0x0f, 0x4b, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, + 0x3a, 0x00, 0x01, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0xc0, + 0x01, 0x72, 0x3a, 0x00, 0x00, 0x41, 0x02, 0x0f, 0x0b, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x80, 0xb0, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x01, + 0x41, 0x80, 0x40, 0x71, 0x41, 0x80, 0xc0, 0x03, 0x47, 0x0d, 0x01, 0x0b, + 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, + 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0xe0, 0x01, + 0x72, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, + 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x03, 0x0f, + 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0x80, 0x80, 0x7c, 0x6a, 0x41, 0xff, + 0xff, 0x3f, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, + 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x20, 0x01, 0x41, + 0x12, 0x76, 0x41, 0xf0, 0x01, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x41, 0x06, 0x76, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, + 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0x3f, 0x71, + 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x04, 0x0f, 0x0b, 0x41, + 0x00, 0x41, 0x19, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x41, + 0x7f, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, 0x18, 0x00, 0x02, 0x40, 0x20, + 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, + 0x00, 0x10, 0xbe, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x8f, 0x01, 0x02, 0x01, + 0x7e, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x00, 0xbd, 0x22, 0x02, 0x42, 0x34, + 0x88, 0xa7, 0x41, 0xff, 0x0f, 0x71, 0x22, 0x03, 0x41, 0xff, 0x0f, 0x46, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, + 0x20, 0x01, 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x43, 0xa2, 0x20, + 0x01, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x20, 0x01, 0x20, + 0x01, 0x28, 0x02, 0x00, 0x41, 0x40, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x0f, 0x0b, 0x20, 0x01, 0x20, 0x03, 0x41, 0x82, 0x78, 0x6a, 0x36, 0x02, + 0x00, 0x20, 0x02, 0x42, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, + 0x80, 0x7f, 0x83, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf0, + 0x3f, 0x84, 0xbf, 0x21, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x24, 0x01, 0x01, + 0x7f, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, + 0x7f, 0x41, 0x00, 0x20, 0x02, 0x20, 0x00, 0x41, 0x01, 0x20, 0x02, 0x20, + 0x01, 0x10, 0xb8, 0x80, 0x80, 0x80, 0x00, 0x47, 0x1b, 0x0b, 0x8c, 0x03, + 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xd0, 0x01, + 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, + 0x02, 0x36, 0x02, 0xcc, 0x01, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x41, + 0x20, 0x6a, 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb8, 0x01, + 0x6a, 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb0, 0x01, 0x6a, + 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x42, 0x00, 0x37, 0x03, 0xa8, + 0x01, 0x20, 0x03, 0x42, 0x00, 0x37, 0x03, 0xa0, 0x01, 0x20, 0x03, 0x20, + 0x02, 0x36, 0x02, 0xc8, 0x01, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x20, + 0x01, 0x20, 0x03, 0x41, 0xc8, 0x01, 0x6a, 0x20, 0x03, 0x41, 0xd0, 0x00, + 0x6a, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x10, 0xc3, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x4e, 0x0d, 0x00, 0x41, 0x7f, 0x21, 0x00, 0x0c, 0x01, + 0x0b, 0x20, 0x00, 0x28, 0x02, 0x00, 0x21, 0x04, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x3c, 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, + 0x41, 0x5f, 0x71, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0xd0, 0x00, 0x36, 0x02, 0x2c, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, + 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x28, 0x02, + 0x28, 0x21, 0x05, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x28, 0x0c, 0x01, + 0x0b, 0x41, 0x00, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x0d, 0x01, + 0x0b, 0x41, 0x7f, 0x21, 0x02, 0x20, 0x00, 0x10, 0xb6, 0x80, 0x80, 0x80, + 0x00, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x03, 0x41, 0xc8, + 0x01, 0x6a, 0x20, 0x03, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x03, 0x41, 0xa0, + 0x01, 0x6a, 0x10, 0xc3, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x0b, 0x20, + 0x04, 0x41, 0x20, 0x71, 0x21, 0x01, 0x02, 0x40, 0x20, 0x05, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, + 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x41, 0x00, + 0x36, 0x02, 0x2c, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x28, 0x20, 0x00, + 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x28, 0x02, 0x14, 0x21, 0x05, + 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x02, 0x41, 0x7f, 0x20, + 0x05, 0x1b, 0x21, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, + 0x22, 0x05, 0x20, 0x01, 0x72, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x20, 0x02, + 0x20, 0x05, 0x41, 0x20, 0x71, 0x1b, 0x21, 0x00, 0x0b, 0x20, 0x03, 0x41, + 0xd0, 0x01, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0b, + 0xf5, 0x46, 0x05, 0x1a, 0x7f, 0x02, 0x7e, 0x01, 0x7c, 0x08, 0x7f, 0x01, + 0x7c, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0x06, 0x6b, 0x22, + 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, + 0x6a, 0x41, 0x0c, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x00, 0x6a, 0x6b, 0x21, 0x07, 0x20, 0x05, 0x41, 0xec, 0x60, 0x6a, 0x21, + 0x08, 0x20, 0x05, 0x41, 0x37, 0x6a, 0x21, 0x09, 0x20, 0x05, 0x41, 0xc4, + 0x00, 0x6a, 0x41, 0x0b, 0x6a, 0x21, 0x0a, 0x20, 0x05, 0x41, 0xd0, 0x00, + 0x6a, 0x41, 0x7f, 0x6a, 0x21, 0x0b, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x41, 0x08, 0x72, 0x21, 0x0c, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, + 0x09, 0x72, 0x21, 0x0d, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x41, 0x0a, + 0x6a, 0x21, 0x0e, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x21, 0x0f, 0x41, 0x00, + 0x21, 0x10, 0x41, 0x00, 0x21, 0x11, 0x41, 0x00, 0x21, 0x12, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x03, 0x40, 0x20, 0x01, 0x21, 0x13, 0x20, 0x12, + 0x20, 0x11, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x01, + 0x20, 0x12, 0x20, 0x11, 0x6a, 0x21, 0x11, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x13, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, + 0x13, 0x21, 0x01, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x12, 0x41, 0xff, 0x01, 0x71, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x12, + 0x41, 0x25, 0x47, 0x0d, 0x02, 0x20, 0x01, 0x21, 0x14, 0x20, 0x01, 0x21, + 0x12, 0x03, 0x40, 0x02, 0x40, 0x20, 0x12, 0x2d, 0x00, 0x01, 0x41, 0x25, + 0x46, 0x0d, 0x00, 0x20, 0x12, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x14, + 0x41, 0x01, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x21, 0x15, + 0x20, 0x12, 0x41, 0x02, 0x6a, 0x22, 0x01, 0x21, 0x12, 0x20, 0x15, 0x41, + 0x25, 0x46, 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x01, 0x21, 0x14, + 0x0b, 0x20, 0x14, 0x20, 0x13, 0x6b, 0x22, 0x12, 0x20, 0x11, 0x41, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x73, 0x22, 0x14, 0x4a, 0x0d, 0x0c, 0x02, 0x40, + 0x20, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x13, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x0d, 0x0b, 0x20, 0x01, 0x41, + 0x01, 0x6a, 0x21, 0x12, 0x41, 0x7f, 0x21, 0x16, 0x02, 0x40, 0x20, 0x01, + 0x2c, 0x00, 0x01, 0x22, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x15, 0x41, 0x09, + 0x4b, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x21, 0x12, 0x20, 0x01, 0x2c, 0x00, + 0x03, 0x21, 0x17, 0x41, 0x01, 0x21, 0x10, 0x20, 0x15, 0x21, 0x16, 0x0b, + 0x41, 0x00, 0x21, 0x18, 0x02, 0x40, 0x20, 0x17, 0x41, 0x60, 0x6a, 0x22, + 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x41, 0x01, 0x20, 0x01, 0x74, 0x22, + 0x01, 0x41, 0x89, 0xd1, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x21, 0x15, 0x41, 0x00, 0x21, 0x18, 0x03, 0x40, 0x20, 0x01, + 0x20, 0x18, 0x72, 0x21, 0x18, 0x20, 0x15, 0x22, 0x12, 0x2c, 0x00, 0x00, + 0x22, 0x17, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x20, 0x4f, 0x0d, 0x01, + 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x15, 0x41, 0x01, 0x20, 0x01, 0x74, + 0x22, 0x01, 0x41, 0x89, 0xd1, 0x04, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02, + 0x40, 0x20, 0x17, 0x41, 0x2a, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x12, 0x2c, 0x00, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, + 0x4b, 0x0d, 0x00, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, + 0x00, 0x20, 0x04, 0x20, 0x01, 0x41, 0x02, 0x74, 0x6a, 0x41, 0x0a, 0x36, + 0x02, 0x00, 0x20, 0x12, 0x41, 0x03, 0x6a, 0x21, 0x15, 0x20, 0x12, 0x2c, + 0x00, 0x01, 0x41, 0x03, 0x74, 0x20, 0x03, 0x6a, 0x41, 0x80, 0x7d, 0x6a, + 0x28, 0x02, 0x00, 0x21, 0x19, 0x41, 0x01, 0x21, 0x10, 0x0c, 0x01, 0x0b, + 0x20, 0x10, 0x0d, 0x06, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x15, 0x02, + 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x10, 0x41, 0x00, 0x21, + 0x19, 0x0c, 0x06, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x01, 0x28, 0x02, 0x00, + 0x21, 0x19, 0x41, 0x00, 0x21, 0x10, 0x0b, 0x20, 0x19, 0x41, 0x7f, 0x4a, + 0x0d, 0x04, 0x41, 0x00, 0x20, 0x19, 0x6b, 0x21, 0x19, 0x20, 0x18, 0x41, + 0x80, 0xc0, 0x00, 0x72, 0x21, 0x18, 0x0c, 0x04, 0x0b, 0x41, 0x00, 0x21, + 0x19, 0x02, 0x40, 0x20, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, + 0x4d, 0x0d, 0x00, 0x20, 0x12, 0x21, 0x15, 0x0c, 0x04, 0x0b, 0x41, 0x00, + 0x21, 0x19, 0x03, 0x40, 0x02, 0x40, 0x20, 0x19, 0x41, 0xcc, 0x99, 0xb3, + 0xe6, 0x00, 0x4b, 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x19, 0x41, 0x0a, 0x6c, + 0x22, 0x15, 0x20, 0x01, 0x6a, 0x20, 0x01, 0x20, 0x15, 0x41, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x73, 0x4b, 0x1b, 0x21, 0x19, 0x20, 0x12, 0x2c, 0x00, + 0x01, 0x21, 0x01, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x22, 0x15, 0x21, 0x12, + 0x20, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x0a, 0x49, 0x0d, 0x01, + 0x20, 0x19, 0x41, 0x00, 0x48, 0x0d, 0x0e, 0x0c, 0x05, 0x0b, 0x20, 0x12, + 0x2c, 0x00, 0x01, 0x21, 0x01, 0x41, 0x7f, 0x21, 0x19, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x21, 0x12, 0x20, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, + 0x0a, 0x49, 0x0d, 0x00, 0x0c, 0x0d, 0x0b, 0x0b, 0x20, 0x01, 0x2d, 0x00, + 0x01, 0x21, 0x12, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x00, + 0x0b, 0x0b, 0x20, 0x00, 0x0d, 0x0b, 0x02, 0x40, 0x20, 0x10, 0x0d, 0x00, + 0x41, 0x00, 0x21, 0x11, 0x0c, 0x0c, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x04, 0x28, 0x02, 0x04, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x01, + 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x02, 0x21, 0x01, 0x0c, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, + 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x0c, + 0x22, 0x01, 0x0d, 0x00, 0x41, 0x03, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x10, 0x22, 0x01, 0x0d, + 0x00, 0x41, 0x04, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x20, + 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x20, 0x04, 0x28, 0x02, 0x14, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x05, + 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x28, 0x6a, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x18, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x06, 0x21, 0x01, 0x0c, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x30, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, + 0xc4, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x1c, + 0x22, 0x01, 0x0d, 0x00, 0x41, 0x07, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x41, 0x38, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x20, 0x22, 0x01, 0x0d, + 0x00, 0x41, 0x08, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0xc0, + 0x00, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x04, 0x28, 0x02, 0x24, 0x22, 0x01, 0x0d, 0x01, 0x41, 0x09, 0x21, + 0x01, 0x0b, 0x20, 0x01, 0x41, 0x02, 0x74, 0x21, 0x01, 0x03, 0x40, 0x20, + 0x04, 0x20, 0x01, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x03, 0x20, 0x01, 0x41, + 0x04, 0x6a, 0x22, 0x01, 0x41, 0x28, 0x47, 0x0d, 0x00, 0x0b, 0x41, 0x01, + 0x21, 0x11, 0x0c, 0x0c, 0x0b, 0x20, 0x03, 0x41, 0xc8, 0x00, 0x6a, 0x20, + 0x01, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x41, 0x01, 0x21, + 0x11, 0x0c, 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x12, 0x41, 0x7f, 0x21, 0x17, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x2d, 0x00, 0x00, 0x41, 0x2e, 0x46, + 0x0d, 0x00, 0x20, 0x15, 0x21, 0x01, 0x41, 0x00, 0x21, 0x1a, 0x0c, 0x01, + 0x0b, 0x02, 0x40, 0x20, 0x15, 0x2c, 0x00, 0x01, 0x22, 0x17, 0x41, 0x2a, + 0x47, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x2c, 0x00, 0x02, + 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4b, 0x0d, 0x00, 0x20, 0x15, + 0x2d, 0x00, 0x03, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, + 0x41, 0x02, 0x74, 0x6a, 0x41, 0x0a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x41, + 0x04, 0x6a, 0x21, 0x01, 0x20, 0x15, 0x2c, 0x00, 0x02, 0x41, 0x03, 0x74, + 0x20, 0x03, 0x6a, 0x41, 0x80, 0x7d, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x17, + 0x0c, 0x01, 0x0b, 0x20, 0x10, 0x0d, 0x03, 0x20, 0x15, 0x41, 0x02, 0x6a, + 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x17, + 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x15, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x28, 0x02, 0x00, 0x21, + 0x17, 0x0b, 0x20, 0x17, 0x41, 0x7f, 0x73, 0x41, 0x1f, 0x76, 0x21, 0x1a, + 0x0c, 0x01, 0x0b, 0x20, 0x15, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x02, 0x40, + 0x20, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x1b, 0x41, 0x09, 0x4d, 0x0d, 0x00, + 0x41, 0x01, 0x21, 0x1a, 0x41, 0x00, 0x21, 0x17, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x21, 0x1c, 0x20, 0x01, 0x21, 0x15, 0x03, 0x40, 0x41, 0x7f, 0x21, + 0x17, 0x02, 0x40, 0x20, 0x1c, 0x41, 0xcc, 0x99, 0xb3, 0xe6, 0x00, 0x4b, + 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x1c, 0x41, 0x0a, 0x6c, 0x22, 0x01, 0x20, + 0x1b, 0x6a, 0x20, 0x1b, 0x20, 0x01, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x73, 0x4b, 0x1b, 0x21, 0x17, 0x0b, 0x41, 0x01, 0x21, 0x1a, 0x20, 0x15, + 0x2c, 0x00, 0x01, 0x21, 0x1b, 0x20, 0x17, 0x21, 0x1c, 0x20, 0x15, 0x41, + 0x01, 0x6a, 0x22, 0x01, 0x21, 0x15, 0x20, 0x1b, 0x41, 0x50, 0x6a, 0x22, + 0x1b, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x03, 0x40, 0x20, 0x12, + 0x21, 0x15, 0x20, 0x01, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, 0x85, 0x7f, + 0x6a, 0x41, 0x46, 0x49, 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, + 0x01, 0x20, 0x12, 0x20, 0x15, 0x41, 0x3a, 0x6c, 0x6a, 0x41, 0x9f, 0x98, + 0x80, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x41, 0x7f, 0x6a, + 0x41, 0x08, 0x49, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x12, 0x41, 0x1b, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x45, 0x0d, 0x03, + 0x02, 0x40, 0x20, 0x16, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x04, 0x20, + 0x16, 0x41, 0x02, 0x74, 0x6a, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, 0x05, + 0x20, 0x03, 0x20, 0x16, 0x41, 0x03, 0x74, 0x6a, 0x29, 0x03, 0x00, 0x37, + 0x03, 0x38, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x11, 0x0c, 0x0e, 0x0b, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x20, + 0x12, 0x20, 0x02, 0x10, 0xc4, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, + 0x20, 0x16, 0x41, 0x7f, 0x4a, 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x21, 0x12, + 0x20, 0x00, 0x45, 0x0d, 0x08, 0x0b, 0x20, 0x18, 0x41, 0xff, 0xff, 0x7b, + 0x71, 0x22, 0x1c, 0x20, 0x18, 0x20, 0x18, 0x41, 0x80, 0xc0, 0x00, 0x71, + 0x1b, 0x21, 0x16, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, + 0x5f, 0x71, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0f, 0x71, 0x41, 0x03, 0x46, + 0x1b, 0x20, 0x12, 0x20, 0x15, 0x1b, 0x22, 0x1d, 0x41, 0xbf, 0x7f, 0x6a, + 0x0e, 0x38, 0x10, 0x12, 0x0d, 0x12, 0x10, 0x10, 0x10, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x0c, 0x12, 0x12, 0x12, + 0x12, 0x03, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x12, + 0x08, 0x05, 0x10, 0x10, 0x10, 0x12, 0x05, 0x12, 0x12, 0x12, 0x09, 0x01, + 0x04, 0x02, 0x12, 0x12, 0x0a, 0x12, 0x00, 0x12, 0x12, 0x03, 0x12, 0x0b, + 0x41, 0x00, 0x21, 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, + 0x20, 0x05, 0x29, 0x03, 0x38, 0x21, 0x1f, 0x0c, 0x05, 0x0b, 0x41, 0x00, + 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x41, 0xff, 0x01, 0x71, 0x0e, 0x08, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x1d, 0x05, 0x06, 0x1d, 0x0b, 0x20, 0x05, + 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1c, 0x0b, 0x20, + 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1b, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0xac, 0x37, 0x03, 0x00, 0x0c, + 0x1a, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3b, 0x01, 0x00, + 0x0c, 0x19, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3a, 0x00, + 0x00, 0x0c, 0x18, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, + 0x02, 0x00, 0x0c, 0x17, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, + 0xac, 0x37, 0x03, 0x00, 0x0c, 0x16, 0x0b, 0x20, 0x17, 0x41, 0x08, 0x20, + 0x17, 0x41, 0x08, 0x4b, 0x1b, 0x21, 0x17, 0x20, 0x16, 0x41, 0x08, 0x72, + 0x21, 0x16, 0x41, 0xf8, 0x00, 0x21, 0x1d, 0x0b, 0x41, 0x00, 0x21, 0x1b, + 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x02, 0x40, 0x20, 0x05, + 0x29, 0x03, 0x38, 0x22, 0x1f, 0x50, 0x45, 0x0d, 0x00, 0x20, 0x0f, 0x21, + 0x13, 0x0c, 0x04, 0x0b, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, + 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, + 0x20, 0x1f, 0xa7, 0x41, 0x0f, 0x71, 0x41, 0xb0, 0x9c, 0x80, 0x80, 0x00, + 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x1f, + 0x42, 0x0f, 0x56, 0x21, 0x12, 0x20, 0x1f, 0x42, 0x04, 0x88, 0x21, 0x1f, + 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x20, 0x16, 0x41, 0x08, 0x71, 0x45, 0x0d, + 0x03, 0x20, 0x1d, 0x41, 0x04, 0x75, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x1e, 0x41, 0x02, 0x21, 0x1b, 0x0c, 0x03, 0x0b, 0x20, 0x0f, + 0x21, 0x13, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, 0x22, 0x1f, 0x50, + 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, + 0x6a, 0x22, 0x13, 0x20, 0x1f, 0xa7, 0x41, 0x07, 0x71, 0x41, 0x30, 0x72, + 0x3a, 0x00, 0x00, 0x20, 0x1f, 0x42, 0x07, 0x56, 0x21, 0x12, 0x20, 0x1f, + 0x42, 0x03, 0x88, 0x21, 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x41, + 0x00, 0x21, 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, + 0x16, 0x41, 0x08, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x17, 0x20, 0x0f, 0x20, + 0x13, 0x6b, 0x22, 0x12, 0x41, 0x01, 0x6a, 0x20, 0x17, 0x20, 0x12, 0x4a, + 0x1b, 0x21, 0x17, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, + 0x38, 0x22, 0x1f, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x05, 0x42, 0x00, + 0x20, 0x1f, 0x7d, 0x22, 0x1f, 0x37, 0x03, 0x38, 0x41, 0x01, 0x21, 0x1b, + 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x16, 0x41, 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, + 0x21, 0x1b, 0x41, 0xab, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, + 0x0b, 0x41, 0xac, 0x95, 0x80, 0x80, 0x00, 0x41, 0xaa, 0x95, 0x80, 0x80, + 0x00, 0x20, 0x16, 0x41, 0x01, 0x71, 0x22, 0x1b, 0x1b, 0x21, 0x1e, 0x0b, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x1f, 0x42, 0x80, 0x80, 0x80, 0x80, 0x10, + 0x5a, 0x0d, 0x00, 0x20, 0x1f, 0x21, 0x20, 0x20, 0x0f, 0x21, 0x13, 0x0c, + 0x01, 0x0b, 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, + 0x6a, 0x22, 0x13, 0x20, 0x1f, 0x20, 0x1f, 0x42, 0x0a, 0x80, 0x22, 0x20, + 0x42, 0x0a, 0x7e, 0x7d, 0xa7, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x1f, 0x42, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x01, 0x56, 0x21, 0x12, 0x20, + 0x20, 0x21, 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x20, 0xa7, + 0x22, 0x12, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, + 0x22, 0x13, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, 0x41, + 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x12, 0x41, + 0x09, 0x4b, 0x21, 0x18, 0x20, 0x15, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, 0x17, 0x41, + 0x00, 0x48, 0x0d, 0x12, 0x0b, 0x20, 0x16, 0x41, 0xff, 0xff, 0x7b, 0x71, + 0x20, 0x16, 0x20, 0x1a, 0x1b, 0x21, 0x1c, 0x02, 0x40, 0x20, 0x05, 0x29, + 0x03, 0x38, 0x22, 0x1f, 0x42, 0x00, 0x52, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x18, 0x20, 0x17, 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x20, 0x0f, 0x21, + 0x12, 0x0c, 0x0c, 0x0b, 0x20, 0x17, 0x20, 0x0f, 0x20, 0x13, 0x6b, 0x20, + 0x1f, 0x50, 0x6a, 0x22, 0x12, 0x20, 0x17, 0x20, 0x12, 0x4a, 0x1b, 0x21, + 0x18, 0x20, 0x0f, 0x21, 0x12, 0x0c, 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, + 0x29, 0x03, 0x38, 0x3c, 0x00, 0x37, 0x41, 0x00, 0x21, 0x1b, 0x41, 0xaa, + 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x41, 0x01, 0x21, 0x18, 0x20, 0x09, + 0x21, 0x13, 0x20, 0x0f, 0x21, 0x12, 0x0c, 0x0a, 0x0b, 0x41, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x10, 0xbb, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x13, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x22, 0x12, + 0x41, 0x81, 0x96, 0x80, 0x80, 0x00, 0x20, 0x12, 0x1b, 0x21, 0x13, 0x0b, + 0x20, 0x13, 0x20, 0x13, 0x20, 0x17, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x20, 0x17, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x1b, 0x10, 0xbd, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x18, 0x6a, 0x21, 0x12, 0x41, 0x00, 0x21, + 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x17, 0x41, + 0x7f, 0x4a, 0x0d, 0x07, 0x20, 0x12, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x07, + 0x0c, 0x0d, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x21, 0x13, 0x20, 0x17, + 0x0d, 0x01, 0x41, 0x00, 0x21, 0x12, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, + 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x05, 0x29, 0x03, 0x38, 0x3e, + 0x02, 0x08, 0x20, 0x05, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x38, + 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, 0x13, 0x41, 0x7f, 0x21, 0x17, 0x0b, + 0x41, 0x00, 0x21, 0x12, 0x20, 0x13, 0x21, 0x14, 0x02, 0x40, 0x03, 0x40, + 0x20, 0x14, 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, 0x02, 0x40, + 0x20, 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xbf, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x15, 0x41, 0x00, 0x48, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x15, + 0x20, 0x17, 0x20, 0x12, 0x6b, 0x4b, 0x0d, 0x00, 0x20, 0x14, 0x41, 0x04, + 0x6a, 0x21, 0x14, 0x20, 0x15, 0x20, 0x12, 0x6a, 0x22, 0x12, 0x20, 0x17, + 0x49, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x18, 0x0d, 0x0c, 0x0b, + 0x20, 0x12, 0x41, 0x00, 0x48, 0x0d, 0x0a, 0x0b, 0x02, 0x40, 0x20, 0x16, + 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x19, 0x20, + 0x12, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, + 0x20, 0x19, 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x13, 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, + 0x20, 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xbf, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x15, 0x20, 0x14, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x4b, 0x0d, + 0x01, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x20, 0x00, 0x10, 0xb7, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x13, 0x41, 0x04, 0x6a, 0x21, + 0x13, 0x20, 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, + 0x20, 0x18, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, + 0x12, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, + 0x20, 0x19, 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x19, 0x20, 0x12, 0x20, 0x19, 0x20, 0x12, 0x4a, 0x1b, 0x21, + 0x12, 0x0c, 0x08, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, + 0x17, 0x41, 0x00, 0x48, 0x0d, 0x09, 0x0b, 0x20, 0x05, 0x2b, 0x03, 0x38, + 0x21, 0x21, 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x6c, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x21, 0xbd, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x21, 0x9a, + 0x21, 0x21, 0x41, 0x01, 0x21, 0x22, 0x41, 0x00, 0x21, 0x23, 0x41, 0xb4, + 0x95, 0x80, 0x80, 0x00, 0x21, 0x24, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x22, + 0x41, 0x00, 0x21, 0x23, 0x41, 0xb7, 0x95, 0x80, 0x80, 0x00, 0x21, 0x24, + 0x0c, 0x01, 0x0b, 0x41, 0xba, 0x95, 0x80, 0x80, 0x00, 0x41, 0xb5, 0x95, + 0x80, 0x80, 0x00, 0x20, 0x16, 0x41, 0x01, 0x71, 0x22, 0x22, 0x1b, 0x21, + 0x24, 0x20, 0x22, 0x45, 0x21, 0x23, 0x0b, 0x02, 0x40, 0x20, 0x21, 0xbd, + 0x42, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x83, + 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf8, 0xff, 0x00, 0x53, + 0x0d, 0x00, 0x20, 0x22, 0x41, 0x03, 0x6a, 0x21, 0x14, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0xc0, 0x00, 0x71, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, + 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, + 0x19, 0x20, 0x14, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, + 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, + 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x12, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x24, 0x20, 0x22, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x21, 0x12, 0x0b, 0x02, + 0x40, 0x20, 0x12, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, 0xe8, 0x95, 0x80, + 0x80, 0x00, 0x41, 0xf4, 0x95, 0x80, 0x80, 0x00, 0x20, 0x1d, 0x41, 0x20, + 0x71, 0x22, 0x12, 0x1b, 0x41, 0xec, 0x95, 0x80, 0x80, 0x00, 0x41, 0xf8, + 0x95, 0x80, 0x80, 0x00, 0x20, 0x12, 0x1b, 0x20, 0x21, 0x20, 0x21, 0x62, + 0x1b, 0x41, 0x03, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x41, 0x80, + 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, 0x4c, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x14, + 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, + 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, + 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, + 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, + 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x20, + 0x19, 0x20, 0x14, 0x20, 0x19, 0x4a, 0x1b, 0x21, 0x12, 0x0c, 0x08, 0x0b, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x20, 0x05, 0x41, 0xec, + 0x00, 0x6a, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x22, 0x21, 0x20, 0x21, + 0xa0, 0x22, 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x22, 0x12, + 0x41, 0x7f, 0x6a, 0x36, 0x02, 0x6c, 0x20, 0x1d, 0x41, 0x20, 0x72, 0x22, + 0x25, 0x41, 0xe1, 0x00, 0x47, 0x0d, 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x1d, + 0x41, 0x20, 0x72, 0x22, 0x25, 0x41, 0xe1, 0x00, 0x46, 0x0d, 0x07, 0x41, + 0x06, 0x20, 0x17, 0x20, 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, + 0x05, 0x28, 0x02, 0x6c, 0x21, 0x13, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x20, + 0x12, 0x41, 0x63, 0x6a, 0x22, 0x13, 0x36, 0x02, 0x6c, 0x41, 0x06, 0x20, + 0x17, 0x20, 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x41, 0xa2, 0x21, 0x21, 0x0b, + 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x00, 0x41, 0xc8, 0x00, 0x20, + 0x13, 0x41, 0x00, 0x48, 0x22, 0x26, 0x1b, 0x41, 0x02, 0x74, 0x22, 0x27, + 0x6a, 0x22, 0x1e, 0x21, 0x14, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x41, 0x63, 0x20, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x21, 0xab, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x21, 0x12, 0x0b, 0x20, 0x14, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, + 0x14, 0x41, 0x04, 0x6a, 0x21, 0x14, 0x20, 0x21, 0x20, 0x12, 0xb8, 0xa1, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x65, 0xcd, 0xcd, 0x41, 0xa2, 0x22, 0x21, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, + 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x13, 0x41, 0x01, 0x4e, 0x0d, 0x00, + 0x20, 0x14, 0x21, 0x12, 0x20, 0x1e, 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, + 0x1e, 0x21, 0x15, 0x03, 0x40, 0x20, 0x13, 0x41, 0x1d, 0x20, 0x13, 0x41, + 0x1d, 0x48, 0x1b, 0x21, 0x13, 0x02, 0x40, 0x20, 0x14, 0x41, 0x7c, 0x6a, + 0x22, 0x12, 0x20, 0x15, 0x49, 0x0d, 0x00, 0x20, 0x13, 0xad, 0x21, 0x20, + 0x42, 0x00, 0x21, 0x1f, 0x03, 0x40, 0x20, 0x12, 0x20, 0x12, 0x35, 0x02, + 0x00, 0x20, 0x20, 0x86, 0x20, 0x1f, 0x42, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x83, 0x7c, 0x22, 0x1f, 0x20, 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, + 0x80, 0x22, 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x7e, 0x7d, 0x3e, + 0x02, 0x00, 0x20, 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x12, 0x20, 0x15, 0x4f, + 0x0d, 0x00, 0x0b, 0x20, 0x1f, 0xa7, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, + 0x15, 0x41, 0x7c, 0x6a, 0x22, 0x15, 0x20, 0x12, 0x36, 0x02, 0x00, 0x0b, + 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, 0x22, 0x12, 0x20, 0x15, 0x4d, 0x0d, + 0x01, 0x20, 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x14, 0x28, 0x02, 0x00, 0x45, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, + 0x13, 0x6b, 0x22, 0x13, 0x36, 0x02, 0x6c, 0x20, 0x12, 0x21, 0x14, 0x20, + 0x13, 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x13, + 0x41, 0x7f, 0x4a, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x19, 0x6a, 0x41, 0x09, + 0x6e, 0x41, 0x01, 0x6a, 0x21, 0x28, 0x03, 0x40, 0x41, 0x00, 0x20, 0x13, + 0x6b, 0x22, 0x14, 0x41, 0x09, 0x20, 0x14, 0x41, 0x09, 0x48, 0x1b, 0x21, + 0x17, 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x20, 0x12, 0x49, 0x0d, 0x00, + 0x20, 0x15, 0x28, 0x02, 0x00, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, + 0x94, 0xeb, 0xdc, 0x03, 0x20, 0x17, 0x76, 0x21, 0x1c, 0x41, 0x7f, 0x20, + 0x17, 0x74, 0x41, 0x7f, 0x73, 0x21, 0x1b, 0x41, 0x00, 0x21, 0x13, 0x20, + 0x15, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, + 0x22, 0x18, 0x20, 0x17, 0x76, 0x20, 0x13, 0x6a, 0x36, 0x02, 0x00, 0x20, + 0x18, 0x20, 0x1b, 0x71, 0x20, 0x1c, 0x6c, 0x21, 0x13, 0x20, 0x14, 0x41, + 0x04, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x20, 0x15, + 0x28, 0x02, 0x00, 0x21, 0x14, 0x20, 0x13, 0x45, 0x0d, 0x00, 0x20, 0x12, + 0x20, 0x13, 0x36, 0x02, 0x00, 0x20, 0x12, 0x41, 0x04, 0x6a, 0x21, 0x12, + 0x0b, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, 0x17, 0x6a, 0x22, + 0x13, 0x36, 0x02, 0x6c, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x14, 0x45, 0x41, + 0x02, 0x74, 0x6a, 0x22, 0x15, 0x20, 0x25, 0x41, 0xe6, 0x00, 0x46, 0x1b, + 0x22, 0x14, 0x20, 0x28, 0x41, 0x02, 0x74, 0x6a, 0x20, 0x12, 0x20, 0x12, + 0x20, 0x14, 0x6b, 0x41, 0x02, 0x75, 0x20, 0x28, 0x4a, 0x1b, 0x21, 0x12, + 0x20, 0x13, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, + 0x18, 0x02, 0x40, 0x20, 0x15, 0x20, 0x12, 0x4f, 0x0d, 0x00, 0x20, 0x1e, + 0x20, 0x15, 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, + 0x15, 0x28, 0x02, 0x00, 0x22, 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, + 0x0a, 0x21, 0x14, 0x03, 0x40, 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, + 0x20, 0x13, 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x20, 0x18, 0x20, 0x25, + 0x41, 0xe6, 0x00, 0x46, 0x1b, 0x6b, 0x20, 0x1a, 0x41, 0x00, 0x47, 0x20, + 0x25, 0x41, 0xe7, 0x00, 0x46, 0x22, 0x1b, 0x71, 0x6b, 0x22, 0x14, 0x20, + 0x12, 0x20, 0x1e, 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x41, 0x77, + 0x6a, 0x4e, 0x0d, 0x00, 0x20, 0x14, 0x41, 0x80, 0xc8, 0x00, 0x6a, 0x22, + 0x13, 0x41, 0x09, 0x6d, 0x22, 0x17, 0x41, 0x02, 0x74, 0x22, 0x29, 0x20, + 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x01, 0x41, 0xc9, 0x00, 0x20, 0x26, + 0x1b, 0x41, 0x02, 0x74, 0x22, 0x26, 0x6a, 0x6a, 0x41, 0x80, 0x60, 0x6a, + 0x21, 0x1c, 0x41, 0x0a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x13, 0x20, 0x17, + 0x41, 0x09, 0x6c, 0x6b, 0x22, 0x17, 0x41, 0x07, 0x4a, 0x0d, 0x00, 0x41, + 0x08, 0x20, 0x17, 0x6b, 0x22, 0x28, 0x41, 0x07, 0x71, 0x21, 0x13, 0x41, + 0x0a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x17, 0x41, 0x7f, 0x6a, 0x41, 0x07, + 0x49, 0x0d, 0x00, 0x20, 0x28, 0x41, 0x78, 0x71, 0x21, 0x17, 0x41, 0x0a, + 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x80, 0xc2, 0xd7, 0x2f, 0x6c, + 0x21, 0x14, 0x20, 0x17, 0x41, 0x78, 0x6a, 0x22, 0x17, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x13, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x14, 0x41, 0x0a, + 0x6c, 0x21, 0x14, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x1c, 0x41, 0x04, 0x6a, 0x21, 0x28, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x1c, 0x28, 0x02, 0x00, 0x22, 0x13, 0x20, 0x13, 0x20, 0x14, + 0x6e, 0x22, 0x25, 0x20, 0x14, 0x6c, 0x6b, 0x22, 0x17, 0x0d, 0x00, 0x20, + 0x28, 0x20, 0x12, 0x46, 0x0d, 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x25, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x43, 0x21, 0x21, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, 0xdc, + 0x03, 0x47, 0x0d, 0x01, 0x20, 0x1c, 0x20, 0x15, 0x4d, 0x0d, 0x01, 0x20, + 0x1c, 0x41, 0x7c, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x01, 0x71, 0x45, 0x0d, + 0x01, 0x0b, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x43, 0x21, + 0x21, 0x0b, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x20, 0x28, 0x20, 0x12, 0x46, 0x1b, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x20, 0x17, 0x20, 0x14, + 0x41, 0x01, 0x76, 0x22, 0x28, 0x46, 0x1b, 0x20, 0x17, 0x20, 0x28, 0x49, + 0x1b, 0x21, 0x2a, 0x02, 0x40, 0x20, 0x23, 0x0d, 0x00, 0x20, 0x24, 0x2d, + 0x00, 0x00, 0x41, 0x2d, 0x47, 0x0d, 0x00, 0x20, 0x2a, 0x9a, 0x21, 0x2a, + 0x20, 0x21, 0x9a, 0x21, 0x21, 0x0b, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x17, + 0x6b, 0x22, 0x13, 0x36, 0x02, 0x00, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, + 0x21, 0x61, 0x0d, 0x00, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x14, 0x6a, 0x22, + 0x14, 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, + 0xdc, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x08, 0x20, 0x26, 0x20, 0x29, 0x6a, + 0x6a, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x04, 0x6a, 0x41, 0x00, + 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x14, 0x20, 0x15, 0x4f, 0x0d, 0x00, + 0x20, 0x15, 0x41, 0x7c, 0x6a, 0x22, 0x15, 0x41, 0x00, 0x36, 0x02, 0x00, + 0x0b, 0x20, 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, 0x41, 0x01, 0x6a, 0x22, + 0x13, 0x36, 0x02, 0x00, 0x20, 0x14, 0x41, 0x7c, 0x6a, 0x21, 0x14, 0x20, + 0x13, 0x41, 0xff, 0x93, 0xeb, 0xdc, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x20, + 0x14, 0x41, 0x04, 0x6a, 0x21, 0x1c, 0x0b, 0x20, 0x1e, 0x20, 0x15, 0x6b, + 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, 0x15, 0x28, 0x02, + 0x00, 0x22, 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, 0x20, 0x13, 0x20, + 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x1c, 0x41, 0x04, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x20, 0x14, + 0x4b, 0x1b, 0x21, 0x12, 0x0b, 0x20, 0x07, 0x20, 0x12, 0x6a, 0x20, 0x27, + 0x6b, 0x21, 0x14, 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, 0x21, 0x13, 0x20, + 0x12, 0x22, 0x1c, 0x20, 0x15, 0x4d, 0x22, 0x17, 0x0d, 0x01, 0x20, 0x13, + 0x41, 0x7c, 0x6a, 0x21, 0x14, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x22, 0x12, + 0x28, 0x02, 0x00, 0x45, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x1b, 0x0d, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, 0x21, 0x28, 0x0c, + 0x01, 0x0b, 0x20, 0x18, 0x41, 0x7f, 0x73, 0x41, 0x7f, 0x20, 0x1a, 0x41, + 0x01, 0x20, 0x1a, 0x1b, 0x22, 0x12, 0x20, 0x18, 0x4a, 0x20, 0x18, 0x41, + 0x7b, 0x4a, 0x71, 0x22, 0x14, 0x1b, 0x20, 0x12, 0x6a, 0x21, 0x1a, 0x41, + 0x7f, 0x41, 0x7e, 0x20, 0x14, 0x1b, 0x20, 0x1d, 0x6a, 0x21, 0x1d, 0x20, + 0x16, 0x41, 0x08, 0x71, 0x22, 0x28, 0x0d, 0x00, 0x41, 0x77, 0x21, 0x12, + 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x17, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x12, 0x20, + 0x17, 0x41, 0x0a, 0x70, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, 0x41, 0x00, + 0x21, 0x12, 0x03, 0x40, 0x20, 0x12, 0x41, 0x7f, 0x6a, 0x21, 0x12, 0x20, + 0x17, 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x70, 0x45, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x13, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x14, + 0x02, 0x40, 0x20, 0x1d, 0x41, 0x5f, 0x71, 0x41, 0xc6, 0x00, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x14, 0x20, 0x12, 0x6a, + 0x41, 0x77, 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, 0x12, 0x41, 0x00, 0x4a, + 0x1b, 0x22, 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, 0x1b, 0x21, 0x1a, 0x0c, + 0x01, 0x0b, 0x41, 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x18, 0x20, 0x14, + 0x6a, 0x20, 0x12, 0x6a, 0x41, 0x77, 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, + 0x12, 0x41, 0x00, 0x4a, 0x1b, 0x22, 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, + 0x1b, 0x21, 0x1a, 0x0b, 0x20, 0x1a, 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, + 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x20, 0x1a, 0x20, 0x28, 0x72, 0x22, + 0x23, 0x1b, 0x4a, 0x0d, 0x08, 0x20, 0x1a, 0x20, 0x23, 0x41, 0x00, 0x47, + 0x6a, 0x41, 0x01, 0x6a, 0x21, 0x25, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1d, + 0x41, 0x5f, 0x71, 0x41, 0xc6, 0x00, 0x47, 0x22, 0x26, 0x0d, 0x00, 0x20, + 0x18, 0x20, 0x25, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, + 0x0a, 0x20, 0x18, 0x41, 0x00, 0x20, 0x18, 0x41, 0x00, 0x4a, 0x1b, 0x21, + 0x12, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x18, 0x0d, 0x00, + 0x20, 0x06, 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x20, + 0x18, 0x20, 0x18, 0x41, 0x1f, 0x75, 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, + 0x21, 0x12, 0x20, 0x06, 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x41, + 0x0a, 0x6e, 0x22, 0x17, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, + 0x00, 0x00, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x21, 0x13, 0x20, 0x12, 0x41, + 0x09, 0x4b, 0x21, 0x1b, 0x20, 0x17, 0x21, 0x12, 0x20, 0x1b, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x20, 0x13, 0x6b, 0x41, 0x01, 0x4a, + 0x0d, 0x00, 0x20, 0x14, 0x20, 0x0e, 0x20, 0x13, 0x6b, 0x6a, 0x22, 0x14, + 0x41, 0x30, 0x20, 0x13, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x6b, 0x41, + 0x76, 0x6a, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, + 0x41, 0x7e, 0x6a, 0x22, 0x27, 0x20, 0x1d, 0x3a, 0x00, 0x00, 0x20, 0x14, + 0x41, 0x7f, 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, 0x41, 0x00, 0x48, + 0x1b, 0x3a, 0x00, 0x00, 0x20, 0x06, 0x20, 0x27, 0x6b, 0x22, 0x12, 0x20, + 0x25, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x09, 0x0b, + 0x20, 0x12, 0x20, 0x25, 0x6a, 0x22, 0x12, 0x20, 0x22, 0x41, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x08, 0x20, 0x12, 0x20, 0x22, 0x6a, + 0x21, 0x1b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, + 0x16, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, + 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, + 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, + 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x24, 0x20, 0x22, 0x20, + 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, + 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, + 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, + 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, + 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x26, 0x0d, 0x03, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x15, 0x20, 0x1e, + 0x4b, 0x1b, 0x22, 0x18, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, + 0x0d, 0x00, 0x41, 0x08, 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, + 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, + 0x22, 0x15, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, + 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, + 0x21, 0x13, 0x20, 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, + 0x14, 0x41, 0x01, 0x6a, 0x22, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x6a, 0x21, 0x12, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x46, 0x0d, 0x00, + 0x20, 0x14, 0x41, 0x02, 0x6a, 0x41, 0x02, 0x48, 0x0d, 0x04, 0x0c, 0x03, + 0x0b, 0x20, 0x14, 0x41, 0x08, 0x47, 0x0d, 0x03, 0x0c, 0x01, 0x0b, 0x41, + 0x09, 0x21, 0x15, 0x20, 0x17, 0x20, 0x18, 0x47, 0x0d, 0x01, 0x0b, 0x20, + 0x05, 0x41, 0x30, 0x3a, 0x00, 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0c, 0x01, + 0x0b, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x0b, 0x20, 0x15, 0x6a, + 0x22, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x12, 0x49, 0x1b, + 0x22, 0x12, 0x41, 0x30, 0x20, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x6a, 0x20, 0x12, 0x6b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x12, 0x20, 0x0d, 0x20, 0x12, 0x6b, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, 0x17, + 0x20, 0x1e, 0x4d, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x23, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, + 0xfc, 0x95, 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1a, 0x41, + 0x01, 0x4e, 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x17, 0x20, 0x1c, 0x49, 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, + 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x0d, 0x00, 0x20, 0x0d, 0x21, 0x14, + 0x20, 0x0d, 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, 0x0d, 0x21, 0x15, 0x20, + 0x0d, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, 0x14, + 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x13, 0x41, 0x0a, 0x6c, + 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x15, 0x41, 0x7f, 0x6a, + 0x21, 0x15, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x18, 0x20, 0x13, 0x21, + 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, + 0x00, 0x6a, 0x4d, 0x0d, 0x01, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, + 0x00, 0x6a, 0x6a, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x30, 0x20, 0x15, + 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x14, 0x20, 0x1a, 0x41, 0x09, 0x20, 0x1a, 0x41, + 0x09, 0x48, 0x1b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x1a, 0x41, 0x77, 0x6a, 0x21, 0x12, 0x20, 0x17, 0x41, 0x04, + 0x6a, 0x22, 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x09, + 0x4a, 0x21, 0x14, 0x20, 0x12, 0x21, 0x1a, 0x20, 0x14, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x41, 0x30, 0x20, 0x12, 0x41, 0x09, 0x6a, 0x41, 0x09, + 0x41, 0x00, 0x10, 0xc5, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x04, 0x0b, 0x41, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x1c, 0x36, 0x02, 0x00, 0x0c, 0x08, + 0x0b, 0x41, 0x00, 0x21, 0x1b, 0x41, 0xaa, 0x95, 0x80, 0x80, 0x00, 0x21, + 0x1e, 0x20, 0x0f, 0x21, 0x12, 0x20, 0x16, 0x21, 0x1c, 0x20, 0x17, 0x21, + 0x18, 0x0b, 0x20, 0x18, 0x20, 0x12, 0x20, 0x13, 0x6b, 0x22, 0x17, 0x20, + 0x18, 0x20, 0x17, 0x4a, 0x1b, 0x22, 0x1a, 0x20, 0x1b, 0x41, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x05, 0x20, 0x19, 0x20, 0x1b, 0x20, + 0x1a, 0x6a, 0x22, 0x15, 0x20, 0x19, 0x20, 0x15, 0x4a, 0x1b, 0x22, 0x12, + 0x20, 0x14, 0x4a, 0x0d, 0x05, 0x02, 0x40, 0x20, 0x1c, 0x41, 0x80, 0xc0, + 0x04, 0x71, 0x22, 0x1c, 0x0d, 0x00, 0x20, 0x15, 0x20, 0x19, 0x4e, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x12, 0x20, + 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x16, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x16, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, + 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, + 0x20, 0x1b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x02, 0x40, 0x20, 0x1c, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, + 0x15, 0x20, 0x19, 0x4e, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x41, 0x30, 0x20, 0x12, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, + 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, 0x22, 0x1b, 0x1b, 0x10, 0xa9, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x1b, 0x0d, 0x00, 0x03, 0x40, + 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, + 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x4e, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x30, 0x20, 0x1a, 0x20, 0x17, + 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, + 0x22, 0x18, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, + 0x20, 0x18, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, + 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, + 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x13, 0x20, + 0x17, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x1c, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x04, 0x20, 0x15, 0x20, 0x19, + 0x4e, 0x0d, 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, + 0x12, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, + 0x80, 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, + 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x20, 0x14, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0c, + 0x04, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, + 0x1c, 0x20, 0x15, 0x41, 0x04, 0x6a, 0x20, 0x1c, 0x20, 0x15, 0x4b, 0x1b, + 0x21, 0x1c, 0x20, 0x15, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, + 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, + 0x6a, 0x41, 0x08, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, + 0x13, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x14, 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, + 0x18, 0x20, 0x13, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, + 0x45, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x6a, + 0x41, 0x09, 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, + 0x3a, 0x00, 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x17, 0x20, 0x15, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x05, 0x41, + 0xd0, 0x00, 0x6a, 0x4d, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x41, 0x30, 0x20, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, + 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x01, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x21, 0x12, 0x02, 0x40, 0x20, 0x28, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x01, + 0x48, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x41, 0xfc, 0x95, 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x0d, 0x20, 0x12, + 0x6b, 0x21, 0x14, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x14, 0x20, 0x1a, 0x20, 0x14, 0x20, + 0x1a, 0x48, 0x1b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x1a, 0x20, 0x14, 0x6b, 0x21, 0x1a, 0x20, 0x17, 0x41, 0x04, + 0x6a, 0x22, 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x7f, + 0x4a, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x30, 0x20, 0x1a, 0x41, + 0x12, 0x6a, 0x41, 0x12, 0x41, 0x00, 0x10, 0xc5, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x27, + 0x20, 0x06, 0x20, 0x27, 0x6b, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x01, + 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, + 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, + 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x01, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0c, 0x01, 0x0b, 0x20, 0x24, 0x20, 0x1d, 0x41, 0x1a, + 0x74, 0x41, 0x1f, 0x75, 0x41, 0x09, 0x71, 0x6a, 0x21, 0x1e, 0x02, 0x40, + 0x20, 0x17, 0x41, 0x0b, 0x4b, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x0c, 0x20, 0x17, 0x6b, 0x22, 0x12, 0x41, 0x07, 0x71, 0x22, 0x14, 0x0d, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, + 0x0c, 0x01, 0x0b, 0x20, 0x17, 0x41, 0x74, 0x6a, 0x21, 0x12, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, 0x03, 0x40, 0x20, + 0x12, 0x41, 0x01, 0x6a, 0x21, 0x12, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x21, 0x2a, 0x20, 0x14, 0x41, 0x7f, + 0x6a, 0x22, 0x14, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x20, 0x12, 0x6b, 0x21, + 0x12, 0x0b, 0x02, 0x40, 0x20, 0x17, 0x41, 0x7b, 0x6a, 0x41, 0x07, 0x49, + 0x0d, 0x00, 0x03, 0x40, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x21, 0x2a, 0x20, 0x12, 0x41, 0x78, 0x6a, 0x22, 0x12, 0x0d, + 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x1e, 0x2d, 0x00, 0x00, 0x41, 0x2d, + 0x47, 0x0d, 0x00, 0x20, 0x2a, 0x20, 0x21, 0x9a, 0x20, 0x2a, 0xa1, 0xa0, + 0x9a, 0x21, 0x21, 0x0c, 0x01, 0x0b, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, + 0x2a, 0xa1, 0x21, 0x21, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, + 0x02, 0x6c, 0x22, 0x18, 0x45, 0x0d, 0x00, 0x20, 0x18, 0x20, 0x18, 0x41, + 0x1f, 0x75, 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, 0x21, 0x12, 0x41, 0x00, + 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, + 0x6a, 0x41, 0x0b, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, + 0x15, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x14, 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, + 0x13, 0x20, 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, 0x14, + 0x45, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, 0x6a, + 0x41, 0x0c, 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, + 0x3a, 0x00, 0x4f, 0x20, 0x0a, 0x21, 0x12, 0x0b, 0x20, 0x22, 0x41, 0x02, + 0x72, 0x21, 0x1c, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, 0x12, + 0x41, 0x7e, 0x6a, 0x22, 0x1a, 0x20, 0x1d, 0x41, 0x0f, 0x6a, 0x3a, 0x00, + 0x00, 0x20, 0x12, 0x41, 0x7f, 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, + 0x41, 0x00, 0x48, 0x1b, 0x3a, 0x00, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, + 0x21, 0x13, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x14, 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x99, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x41, 0x63, 0x45, 0x0d, 0x00, + 0x20, 0x21, 0xaa, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, 0x80, 0x80, + 0x80, 0x78, 0x21, 0x14, 0x0b, 0x20, 0x12, 0x20, 0x14, 0x41, 0xb0, 0x9c, + 0x80, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, + 0x00, 0x20, 0x21, 0x20, 0x14, 0xb7, 0xa1, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x40, 0xa2, 0x21, 0x21, 0x02, 0x40, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x22, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x41, + 0x01, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x13, 0x0d, 0x00, 0x20, 0x17, + 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x20, 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x0d, 0x01, 0x0b, 0x20, 0x12, 0x41, 0x2e, + 0x3a, 0x00, 0x01, 0x20, 0x12, 0x41, 0x02, 0x6a, 0x21, 0x14, 0x0b, 0x20, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, + 0x00, 0x0b, 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, 0x20, 0x06, 0x20, 0x1a, + 0x6b, 0x22, 0x18, 0x20, 0x1c, 0x6a, 0x22, 0x12, 0x6b, 0x20, 0x17, 0x48, + 0x0d, 0x02, 0x20, 0x17, 0x41, 0x02, 0x6a, 0x20, 0x14, 0x20, 0x05, 0x41, + 0xd0, 0x00, 0x6a, 0x6b, 0x22, 0x14, 0x20, 0x14, 0x41, 0x7e, 0x6a, 0x20, + 0x17, 0x48, 0x1b, 0x20, 0x14, 0x20, 0x17, 0x1b, 0x22, 0x13, 0x20, 0x12, + 0x6a, 0x21, 0x1b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, + 0x22, 0x15, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, + 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, + 0x17, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, + 0x17, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, + 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x1c, + 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x15, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, + 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, + 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x17, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x13, 0x20, + 0x14, 0x6b, 0x22, 0x12, 0x41, 0x01, 0x48, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x1a, 0x20, 0x18, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x15, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, + 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, + 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xa9, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, + 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, + 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x1b, 0x20, 0x19, 0x20, 0x1b, 0x20, 0x19, + 0x4a, 0x1b, 0x22, 0x12, 0x41, 0x00, 0x4e, 0x0d, 0x00, 0x0b, 0x0b, 0x41, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x3d, 0x36, 0x02, 0x00, 0x0b, 0x41, + 0x7f, 0x21, 0x11, 0x0b, 0x20, 0x05, 0x41, 0xf0, 0x06, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x11, 0x0b, 0xb3, 0x04, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x01, 0x41, 0x77, 0x6a, 0x0e, 0x12, 0x11, 0x00, 0x01, 0x04, 0x02, + 0x03, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x12, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x34, 0x02, + 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x34, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, + 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, + 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, + 0x6a, 0x41, 0x78, 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, + 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x32, 0x01, 0x00, 0x37, 0x03, + 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x33, 0x01, + 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x30, 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x31, 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, + 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, + 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, 0x01, + 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, 0x03, + 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x34, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, + 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, + 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, + 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x2b, 0x03, 0x00, 0x39, 0x03, 0x00, 0x0f, 0x0b, 0x10, 0xc6, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, + 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, + 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x9e, 0x01, 0x01, 0x01, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x80, 0x02, 0x6b, 0x22, + 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x02, 0x20, + 0x03, 0x4c, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x03, + 0x41, 0x80, 0x02, 0x20, 0x03, 0x41, 0x80, 0x02, 0x49, 0x22, 0x04, 0x1b, + 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x04, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, + 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x03, 0x41, 0x80, 0x7e, + 0x6a, 0x22, 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x03, 0x20, 0x00, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x05, 0x41, 0x80, 0x02, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0b, + 0x1c, 0x00, 0x41, 0xb6, 0x97, 0x80, 0x80, 0x00, 0x41, 0xb8, 0x9d, 0x80, + 0x80, 0x00, 0x10, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x10, 0xa4, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x3b, 0x01, 0x01, 0x7f, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x02, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x41, 0xc0, 0x9c, + 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xc2, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x01, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x01, 0x0b, 0x49, 0x01, 0x03, 0x7f, 0x41, 0x00, 0x21, + 0x03, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x03, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x22, 0x05, 0x47, 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, + 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, + 0x22, 0x02, 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, + 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, 0x2e, 0x01, 0x02, 0x7f, 0x02, + 0x40, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x41, 0x01, 0x6a, + 0x22, 0x01, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, + 0x00, 0x20, 0x02, 0x20, 0x00, 0x20, 0x01, 0x10, 0xa8, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x02, 0x0b, 0xe0, 0x01, 0x01, 0x04, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x41, 0x00, 0x2d, 0x00, 0xec, 0xaa, + 0x80, 0x80, 0x00, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x2d, 0x00, + 0xec, 0xaa, 0x80, 0x80, 0x00, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x41, 0x03, + 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x20, 0x01, + 0x20, 0x00, 0x41, 0x08, 0x6a, 0x10, 0x9c, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x08, 0x47, 0x0d, 0x02, 0x41, + 0x00, 0x41, 0x01, 0x3a, 0x00, 0xec, 0xaa, 0x80, 0x80, 0x00, 0x0c, 0x04, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x08, 0x0d, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x0c, 0x22, 0x03, 0x41, 0x01, 0x6a, 0x10, 0x90, 0x80, 0x80, + 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x20, + 0x03, 0x10, 0x9d, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x02, 0x20, 0x02, 0x20, + 0x00, 0x28, 0x02, 0x0c, 0x6a, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x10, 0xcb, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x03, 0x20, 0x02, + 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x01, 0x0c, 0x00, 0x0b, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x95, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x95, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x97, 0x02, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x0e, 0x02, 0x01, 0x01, 0x00, 0x0b, + 0x20, 0x01, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe4, + 0xaa, 0x80, 0x80, 0x00, 0x22, 0x02, 0x41, 0x00, 0x28, 0x02, 0xf0, 0xaa, + 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xaa, + 0x80, 0x80, 0x00, 0x21, 0x03, 0x02, 0x40, 0x41, 0x08, 0x20, 0x02, 0x41, + 0x01, 0x74, 0x41, 0x04, 0x20, 0x02, 0x1b, 0x22, 0x04, 0x10, 0x94, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, + 0x05, 0x20, 0x03, 0x20, 0x02, 0x41, 0x03, 0x74, 0x10, 0xa8, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x05, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0xf0, 0xaa, + 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0xe8, 0xaa, 0x80, + 0x80, 0x00, 0x20, 0x03, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x02, + 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x22, 0x03, 0x2d, + 0x00, 0x00, 0x41, 0x52, 0x6a, 0x0e, 0x02, 0x01, 0x00, 0x03, 0x0b, 0x20, + 0x03, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x01, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x01, 0x22, 0x04, 0x45, + 0x0d, 0x00, 0x20, 0x04, 0x41, 0x2f, 0x47, 0x0d, 0x01, 0x20, 0x03, 0x41, + 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x03, + 0x10, 0xc9, 0x80, 0x80, 0x80, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x7f, + 0x0f, 0x0b, 0x41, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x36, 0x02, 0xe4, + 0xaa, 0x80, 0x80, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xaa, 0x80, 0x80, + 0x00, 0x20, 0x02, 0x41, 0x03, 0x74, 0x6a, 0x22, 0x01, 0x20, 0x00, 0x36, + 0x02, 0x04, 0x20, 0x01, 0x20, 0x03, 0x36, 0x02, 0x00, 0x41, 0x00, 0x0f, + 0x0b, 0x10, 0xa4, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x5d, 0x01, 0x01, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x04, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, + 0x0c, 0x02, 0x40, 0x02, 0x40, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x45, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x04, 0x41, 0x0c, + 0x6a, 0x41, 0x00, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0c, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xcd, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x03, 0x0b, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x0b, 0xbd, 0x02, 0x01, 0x0a, 0x7f, + 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x10, 0xca, 0x80, 0x80, 0x80, + 0x00, 0x03, 0x40, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x2d, 0x00, + 0x00, 0x41, 0x2f, 0x46, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x02, + 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe4, 0xaa, 0x80, 0x80, 0x00, + 0x22, 0x05, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe8, 0xaa, 0x80, + 0x80, 0x00, 0x21, 0x06, 0x41, 0x7f, 0x21, 0x07, 0x03, 0x40, 0x20, 0x06, + 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x74, 0x6a, 0x22, + 0x08, 0x28, 0x02, 0x00, 0x22, 0x09, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x0a, 0x02, 0x40, 0x02, 0x40, 0x20, 0x07, 0x41, 0x7f, 0x46, 0x0d, + 0x00, 0x20, 0x0a, 0x20, 0x04, 0x4d, 0x0d, 0x01, 0x0b, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x0a, 0x0d, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x41, 0xff, + 0x01, 0x71, 0x41, 0x2f, 0x47, 0x0d, 0x01, 0x0b, 0x20, 0x03, 0x20, 0x09, + 0x20, 0x0a, 0x10, 0xc8, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x09, + 0x41, 0x7f, 0x6a, 0x21, 0x0b, 0x20, 0x0a, 0x21, 0x0c, 0x02, 0x40, 0x03, + 0x40, 0x20, 0x0c, 0x22, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x7f, + 0x6a, 0x21, 0x0c, 0x20, 0x0b, 0x20, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, + 0x2f, 0x46, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x6a, 0x2d, + 0x00, 0x00, 0x22, 0x00, 0x41, 0x2f, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x0d, + 0x01, 0x0b, 0x20, 0x01, 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, 0x08, 0x28, + 0x02, 0x04, 0x21, 0x07, 0x20, 0x0a, 0x21, 0x04, 0x0b, 0x20, 0x05, 0x0d, + 0x00, 0x0b, 0x20, 0x07, 0x41, 0x7f, 0x47, 0x0d, 0x01, 0x0b, 0x41, 0x00, + 0x41, 0x2c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0f, + 0x0b, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x41, 0x7f, 0x6a, 0x21, 0x00, 0x03, + 0x40, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x00, 0x2d, 0x00, 0x00, 0x22, + 0x03, 0x41, 0x2f, 0x46, 0x0d, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x00, 0x41, + 0xfc, 0x95, 0x80, 0x80, 0x00, 0x20, 0x03, 0x1b, 0x36, 0x02, 0x00, 0x20, + 0x07, 0x0b, 0x99, 0x02, 0x02, 0x02, 0x7f, 0x02, 0x7e, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, + 0x41, 0x80, 0x80, 0x80, 0xf0, 0x01, 0x71, 0x41, 0x80, 0x80, 0x80, 0x70, + 0x6a, 0x41, 0x19, 0x76, 0x22, 0x04, 0x41, 0x09, 0x4b, 0x0d, 0x00, 0x41, + 0x01, 0x20, 0x04, 0x74, 0x22, 0x04, 0x41, 0x82, 0x05, 0x71, 0x0d, 0x01, + 0x42, 0xbc, 0xfd, 0xfe, 0x7d, 0x21, 0x05, 0x20, 0x04, 0x41, 0x09, 0x71, + 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, 0x80, + 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x0c, 0x02, 0x0b, 0x42, 0xbe, 0xfd, + 0xff, 0x7d, 0x42, 0xbc, 0xfd, 0xfe, 0x7d, 0x20, 0x02, 0x41, 0x80, 0x80, + 0x80, 0x20, 0x71, 0x1b, 0x22, 0x05, 0x42, 0xc1, 0x82, 0x80, 0x02, 0x84, + 0x20, 0x05, 0x20, 0x02, 0x41, 0x80, 0x80, 0x80, 0x80, 0x01, 0x71, 0x1b, + 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, + 0x10, 0x9a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x41, + 0x00, 0x20, 0x04, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, + 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x02, 0x41, 0x7f, 0x73, 0x41, 0x18, 0x76, 0x41, 0x01, 0x71, + 0x20, 0x01, 0x20, 0x02, 0x41, 0x0c, 0x76, 0x41, 0xff, 0x1f, 0x71, 0x20, + 0x03, 0x29, 0x03, 0x18, 0x22, 0x06, 0x20, 0x05, 0x83, 0x20, 0x06, 0x20, + 0x02, 0x41, 0xff, 0x1f, 0x71, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x10, 0xa2, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x02, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x28, 0x02, 0x04, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x41, 0x20, 0x6a, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x23, 0x00, 0x02, + 0x40, 0x20, 0x00, 0x20, 0x01, 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x01, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x20, 0x01, 0x36, + 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0b, 0xa1, 0x01, 0x01, + 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x02, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x02, + 0x41, 0x0c, 0x6a, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xaa, + 0x80, 0x80, 0x00, 0x41, 0x01, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x02, 0x41, 0x0c, 0x6a, 0x41, + 0xf4, 0xaa, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xaa, 0x80, 0x80, 0x00, 0x28, + 0x02, 0x00, 0x10, 0xcc, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0b, 0x41, + 0x7f, 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x47, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x2c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, + 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, + 0x28, 0x02, 0x00, 0x20, 0x01, 0x10, 0xce, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x00, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x00, 0x0b, 0x9f, 0x01, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x02, 0x41, 0x0c, 0x6a, 0x41, 0xf4, + 0xaa, 0x80, 0x80, 0x00, 0x41, 0xf8, 0xaa, 0x80, 0x80, 0x00, 0x41, 0x01, + 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, + 0x00, 0x20, 0x02, 0x41, 0x0c, 0x6a, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, + 0x41, 0xf8, 0xaa, 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x10, 0xcc, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x03, 0x0b, 0x41, 0x7f, 0x21, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, + 0x2c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, + 0x03, 0x41, 0xf4, 0xaa, 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x10, 0xcf, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x6a, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0b, 0xe1, 0x02, 0x01, + 0x03, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, + 0x41, 0xff, 0x01, 0x71, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x22, 0x03, 0x0d, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x03, 0x20, 0x01, + 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x01, 0x20, 0x00, 0x0f, 0x0b, 0x20, + 0x00, 0x20, 0x00, 0x10, 0xaa, 0x80, 0x80, 0x80, 0x00, 0x6a, 0x0f, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x03, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x2d, + 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x01, 0x41, + 0xff, 0x01, 0x71, 0x46, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x02, + 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x00, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, + 0x01, 0x20, 0x04, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x01, + 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x03, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x2d, + 0x00, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x01, 0x41, + 0xff, 0x01, 0x71, 0x46, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, + 0x00, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, + 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, + 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x81, + 0x82, 0x84, 0x08, 0x6c, 0x21, 0x02, 0x03, 0x40, 0x20, 0x03, 0x20, 0x02, + 0x73, 0x22, 0x03, 0x41, 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, + 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x0d, 0x01, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, 0x00, 0x22, 0x03, + 0x41, 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, + 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x03, 0x40, 0x20, 0x03, 0x41, + 0x01, 0x6a, 0x22, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x03, 0x0b, 0x1d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xd2, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x41, 0x00, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x1b, 0x0b, 0x65, 0x01, + 0x03, 0x7f, 0x41, 0x80, 0x80, 0x80, 0xa0, 0x01, 0x41, 0x80, 0x80, 0x80, + 0x20, 0x41, 0x80, 0x80, 0x80, 0x80, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x22, 0x01, 0x41, 0xf2, 0x00, 0x46, 0x22, 0x02, 0x1b, 0x20, 0x00, 0x41, + 0x2b, 0x10, 0xd3, 0x80, 0x80, 0x80, 0x00, 0x1b, 0x22, 0x03, 0x41, 0x80, + 0x80, 0x01, 0x72, 0x20, 0x03, 0x20, 0x00, 0x41, 0xf8, 0x00, 0x10, 0xd3, + 0x80, 0x80, 0x80, 0x00, 0x1b, 0x22, 0x00, 0x20, 0x00, 0x41, 0x80, 0x20, + 0x72, 0x20, 0x02, 0x1b, 0x22, 0x00, 0x41, 0x80, 0x80, 0x02, 0x72, 0x20, + 0x00, 0x20, 0x01, 0x41, 0xf7, 0x00, 0x46, 0x1b, 0x20, 0x01, 0x41, 0xe1, + 0x00, 0x46, 0x72, 0x0b, 0x92, 0x02, 0x02, 0x01, 0x7f, 0x02, 0x7e, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x0e, 0x04, 0x05, + 0x00, 0x01, 0x02, 0x03, 0x0b, 0x41, 0x00, 0x21, 0x01, 0x0c, 0x04, 0x0b, + 0x02, 0x40, 0x20, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x10, 0x9a, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x01, + 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x03, 0x0b, 0x20, 0x03, + 0x29, 0x03, 0x10, 0x22, 0x04, 0x42, 0xc0, 0x00, 0x83, 0x21, 0x05, 0x20, + 0x03, 0x2f, 0x01, 0x0a, 0x21, 0x01, 0x02, 0x40, 0x20, 0x04, 0x42, 0x82, + 0x80, 0x01, 0x83, 0x50, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x05, 0x50, 0x0d, + 0x00, 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0xa0, 0x01, 0x72, 0x21, 0x01, + 0x0c, 0x05, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0x20, 0x72, 0x21, + 0x01, 0x0c, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x50, 0x0d, 0x00, 0x20, + 0x01, 0x41, 0x80, 0x80, 0x80, 0x80, 0x01, 0x72, 0x21, 0x01, 0x0c, 0x04, + 0x0b, 0x20, 0x01, 0x41, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x72, 0x21, 0x01, + 0x0c, 0x03, 0x0b, 0x20, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x36, 0x02, + 0x08, 0x02, 0x40, 0x20, 0x00, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0xff, + 0x1f, 0x71, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x0d, 0x00, + 0x41, 0x00, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x41, 0x00, 0x20, 0x01, 0x36, + 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x41, + 0x1c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x7f, 0x21, + 0x01, 0x0b, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x01, 0x0b, 0x71, 0x01, 0x02, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x9e, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x28, 0x02, 0x0c, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x41, 0x10, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x70, 0x01, + 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0x0c, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x08, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x41, 0x01, 0x20, 0x03, + 0x41, 0x04, 0x6a, 0x10, 0x9e, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, + 0x0d, 0x00, 0x41, 0x00, 0x41, 0x08, 0x20, 0x02, 0x20, 0x02, 0x41, 0xcc, + 0x00, 0x46, 0x1b, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x7f, + 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x04, 0x21, 0x02, + 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x02, 0x0b, 0xfc, 0x01, 0x01, 0x05, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x03, 0x20, 0x01, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, + 0x28, 0x02, 0x2c, 0x22, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x00, + 0x28, 0x02, 0x28, 0x22, 0x05, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x02, + 0x20, 0x04, 0x41, 0x00, 0x47, 0x6b, 0x22, 0x06, 0x36, 0x02, 0x04, 0x20, + 0x00, 0x28, 0x02, 0x38, 0x21, 0x07, 0x02, 0x40, 0x02, 0x40, 0x20, 0x06, + 0x45, 0x0d, 0x00, 0x20, 0x07, 0x20, 0x03, 0x41, 0x02, 0x10, 0xd6, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x07, 0x20, 0x05, + 0x20, 0x04, 0x10, 0xd7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x04, 0x0b, 0x41, + 0x00, 0x21, 0x06, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, 0x00, 0x4a, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x41, + 0x10, 0x20, 0x04, 0x1b, 0x72, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x07, 0x4b, 0x0d, + 0x00, 0x20, 0x04, 0x21, 0x06, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x28, 0x22, 0x06, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x06, + 0x20, 0x04, 0x20, 0x07, 0x6b, 0x6a, 0x36, 0x02, 0x08, 0x02, 0x40, 0x20, + 0x00, 0x28, 0x02, 0x2c, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x06, 0x41, + 0x01, 0x6a, 0x36, 0x02, 0x04, 0x20, 0x02, 0x20, 0x01, 0x6a, 0x41, 0x7f, + 0x6a, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x02, + 0x21, 0x06, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x06, 0x0b, 0x37, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x10, + 0xb3, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, + 0x34, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, 0x0d, + 0x00, 0x20, 0x02, 0x20, 0x00, 0x36, 0x02, 0x30, 0x0b, 0x20, 0x01, 0x20, + 0x00, 0x36, 0x02, 0x00, 0x10, 0xb4, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x0b, 0x85, 0x03, 0x01, 0x04, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x41, 0x20, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x41, 0xf0, 0x95, 0x80, 0x80, 0x00, 0x20, 0x01, 0x2c, + 0x00, 0x00, 0x22, 0x03, 0x41, 0x04, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, + 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, + 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x41, 0xf8, + 0x08, 0x10, 0x90, 0x80, 0x80, 0x80, 0x00, 0x22, 0x04, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x05, 0x20, 0x04, + 0x41, 0x00, 0x41, 0xf0, 0x00, 0x10, 0xa9, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x2b, 0x10, 0xd3, 0x80, 0x80, 0x80, + 0x00, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x08, 0x41, 0x04, 0x20, 0x03, 0x41, + 0xf2, 0x00, 0x46, 0x1b, 0x22, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, + 0x20, 0x01, 0x41, 0xe5, 0x00, 0x10, 0xd3, 0x80, 0x80, 0x80, 0x00, 0x45, + 0x0d, 0x00, 0x20, 0x02, 0x41, 0x01, 0x36, 0x02, 0x10, 0x20, 0x00, 0x41, + 0x02, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x10, 0xd5, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x0b, 0x02, 0x40, 0x20, + 0x03, 0x41, 0xff, 0x01, 0x71, 0x41, 0xe1, 0x00, 0x47, 0x0d, 0x00, 0x02, + 0x40, 0x20, 0x00, 0x41, 0x03, 0x41, 0x00, 0x10, 0xd5, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x01, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x00, 0x20, 0x00, 0x41, 0x04, 0x20, 0x02, + 0x10, 0xd5, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x04, 0x20, 0x05, + 0x41, 0x80, 0x01, 0x72, 0x22, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x04, + 0x41, 0x7f, 0x36, 0x02, 0x40, 0x20, 0x04, 0x41, 0x80, 0x08, 0x36, 0x02, + 0x2c, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x38, 0x20, 0x04, 0x20, 0x04, + 0x41, 0xf8, 0x00, 0x6a, 0x36, 0x02, 0x28, 0x02, 0x40, 0x20, 0x05, 0x41, + 0x08, 0x71, 0x0d, 0x00, 0x20, 0x00, 0x10, 0xaf, 0x80, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x0a, 0x36, 0x02, 0x40, 0x0b, 0x20, + 0x04, 0x41, 0x84, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x24, 0x20, 0x04, + 0x41, 0x81, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x20, 0x20, 0x04, 0x41, + 0x85, 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x1c, 0x20, 0x04, 0x41, 0x82, + 0x80, 0x80, 0x80, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x10, 0xd9, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x65, 0x01, 0x01, 0x7f, + 0x02, 0x40, 0x41, 0xf0, 0x95, 0x80, 0x80, 0x00, 0x20, 0x01, 0x2c, 0x00, + 0x00, 0x41, 0x04, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x10, 0xd4, 0x80, 0x80, 0x80, 0x00, 0x10, 0xd0, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x00, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, + 0xda, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x00, 0x10, + 0xab, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, 0x21, 0x02, 0x0b, 0x20, + 0x02, 0x0b, 0xb1, 0x01, 0x01, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x03, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, 0x36, 0x02, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x01, 0xac, 0x21, 0x03, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x01, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x08, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x04, 0x6b, 0xac, 0x7d, 0x21, 0x03, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, + 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x28, 0x02, + 0x14, 0x0d, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x36, + 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x02, 0x40, 0x20, + 0x00, 0x20, 0x03, 0x20, 0x02, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x42, 0x00, 0x59, 0x0d, 0x00, 0x41, 0x7f, + 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x00, 0x41, 0x6f, 0x71, 0x36, 0x02, 0x00, 0x41, 0x00, + 0x0b, 0x85, 0x01, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x3c, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x36, 0x02, 0x3c, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, + 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, + 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, + 0x10, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, + 0x02, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x28, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x22, 0x02, 0x36, 0x02, 0x08, + 0x20, 0x00, 0x20, 0x02, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x1b, 0x74, + 0x41, 0x1f, 0x75, 0x0b, 0xc4, 0x01, 0x01, 0x03, 0x7f, 0x20, 0x03, 0x20, + 0x03, 0x28, 0x02, 0x3c, 0x22, 0x04, 0x41, 0x7f, 0x6a, 0x20, 0x04, 0x72, + 0x36, 0x02, 0x3c, 0x20, 0x02, 0x20, 0x01, 0x6c, 0x21, 0x05, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x04, 0x20, 0x03, 0x28, + 0x02, 0x08, 0x22, 0x06, 0x47, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x04, 0x0c, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x22, + 0x06, 0x20, 0x05, 0x20, 0x06, 0x20, 0x05, 0x49, 0x1b, 0x22, 0x06, 0x10, + 0xa8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x20, 0x03, 0x20, 0x04, 0x20, + 0x06, 0x6a, 0x36, 0x02, 0x04, 0x20, 0x05, 0x20, 0x06, 0x6b, 0x21, 0x04, + 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x00, 0x0b, 0x20, 0x02, 0x41, 0x00, + 0x20, 0x01, 0x1b, 0x21, 0x06, 0x02, 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x10, 0xdd, 0x80, 0x80, + 0x80, 0x00, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x00, 0x20, 0x04, 0x20, 0x03, + 0x28, 0x02, 0x1c, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, 0x02, + 0x0d, 0x01, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x20, 0x01, 0x6e, 0x0f, + 0x0b, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x00, 0x20, 0x04, 0x20, 0x02, + 0x6b, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x06, 0x0b, 0xe8, 0x02, + 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x01, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xb0, 0x9d, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xb0, 0x9d, 0x80, 0x80, 0x00, + 0x10, 0xdf, 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x41, + 0x00, 0x28, 0x02, 0xa8, 0x9e, 0x80, 0x80, 0x00, 0x45, 0x0d, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xa8, 0x9e, 0x80, 0x80, 0x00, 0x10, 0xdf, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x01, 0x72, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x10, 0xb3, + 0x80, 0x80, 0x80, 0x00, 0x28, 0x02, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, + 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x0d, 0x00, 0x41, + 0x7f, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x04, 0x22, 0x02, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x03, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0xac, 0x41, 0x01, 0x20, + 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x0b, 0x41, 0x00, 0x21, 0x02, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, + 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x42, 0x00, 0x37, + 0x02, 0x04, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x72, 0x21, 0x01, 0x0b, 0x20, + 0x00, 0x28, 0x02, 0x34, 0x22, 0x00, 0x0d, 0x00, 0x0b, 0x0b, 0x10, 0xb4, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x28, 0x02, 0x14, 0x0d, + 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x04, + 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, + 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, + 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, + 0x03, 0x10, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x41, 0x00, 0x0b, + 0x02, 0x00, 0x0b, 0x98, 0x01, 0x01, 0x05, 0x7f, 0x20, 0x00, 0x10, 0xdf, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x0c, 0x11, 0x82, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x02, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x01, 0x71, 0x0d, 0x00, 0x20, 0x00, + 0x10, 0xe0, 0x80, 0x80, 0x80, 0x00, 0x10, 0xb3, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x30, 0x22, 0x04, 0x45, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x00, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x34, 0x22, 0x05, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x04, 0x36, 0x02, 0x30, 0x0b, 0x02, 0x40, 0x20, + 0x03, 0x28, 0x02, 0x00, 0x20, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x05, 0x36, 0x02, 0x00, 0x0b, 0x10, 0xb4, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x50, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x72, + 0x0b, 0xd2, 0x06, 0x01, 0x51, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x02, 0x41, 0xb0, 0x01, 0x21, 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, + 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x21, 0x05, 0x20, 0x04, 0x20, 0x05, 0x36, 0x02, 0xac, 0x01, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0xa8, 0x01, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, + 0xa4, 0x01, 0x41, 0x00, 0x21, 0x06, 0x20, 0x04, 0x20, 0x06, 0x36, 0x02, + 0x9c, 0x01, 0x41, 0xb9, 0x98, 0x80, 0x80, 0x00, 0x21, 0x07, 0x41, 0x00, + 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x41, 0xdc, 0x95, 0x80, 0x80, 0x00, 0x21, 0x09, 0x41, 0xff, 0x03, + 0x21, 0x0a, 0x20, 0x09, 0x20, 0x0a, 0x10, 0xd1, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x0b, 0x20, 0x04, 0x20, 0x0b, 0x36, 0x02, 0xa0, 0x01, 0x20, 0x04, + 0x28, 0x02, 0xa0, 0x01, 0x21, 0x0c, 0x41, 0x00, 0x21, 0x0d, 0x20, 0x0c, + 0x21, 0x0e, 0x20, 0x0d, 0x21, 0x0f, 0x20, 0x0e, 0x20, 0x0f, 0x48, 0x21, + 0x10, 0x41, 0x01, 0x21, 0x11, 0x20, 0x10, 0x20, 0x11, 0x71, 0x21, 0x12, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, 0x45, 0x0d, 0x00, 0x41, 0xb4, 0x9e, + 0x80, 0x80, 0x00, 0x21, 0x13, 0x20, 0x13, 0x28, 0x02, 0x00, 0x21, 0x14, + 0x20, 0x04, 0x20, 0x14, 0x36, 0x02, 0xa0, 0x01, 0x20, 0x04, 0x28, 0x02, + 0xa0, 0x01, 0x21, 0x15, 0x20, 0x04, 0x20, 0x15, 0x36, 0x02, 0x00, 0x41, + 0xcd, 0x96, 0x80, 0x80, 0x00, 0x21, 0x16, 0x20, 0x16, 0x20, 0x04, 0x10, + 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x7f, 0x21, 0x17, 0x20, 0x04, + 0x20, 0x17, 0x36, 0x02, 0xac, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, + 0x02, 0xa0, 0x01, 0x21, 0x18, 0x20, 0x04, 0x20, 0x18, 0x36, 0x02, 0x50, + 0x41, 0xe9, 0x96, 0x80, 0x80, 0x00, 0x21, 0x19, 0x41, 0xd0, 0x00, 0x21, + 0x1a, 0x20, 0x04, 0x20, 0x1a, 0x6a, 0x21, 0x1b, 0x20, 0x19, 0x20, 0x1b, + 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0xc7, 0x95, 0x80, 0x80, + 0x00, 0x21, 0x1c, 0x41, 0xfe, 0x95, 0x80, 0x80, 0x00, 0x21, 0x1d, 0x20, + 0x1c, 0x20, 0x1d, 0x10, 0xdb, 0x80, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, + 0x04, 0x20, 0x1e, 0x36, 0x02, 0x98, 0x01, 0x20, 0x04, 0x28, 0x02, 0x98, + 0x01, 0x21, 0x1f, 0x41, 0x00, 0x21, 0x20, 0x20, 0x1f, 0x21, 0x21, 0x20, + 0x20, 0x21, 0x22, 0x20, 0x21, 0x20, 0x22, 0x47, 0x21, 0x23, 0x41, 0x01, + 0x21, 0x24, 0x20, 0x23, 0x20, 0x24, 0x71, 0x21, 0x25, 0x02, 0x40, 0x20, + 0x25, 0x0d, 0x00, 0x41, 0xa8, 0x96, 0x80, 0x80, 0x00, 0x21, 0x26, 0x41, + 0x00, 0x21, 0x27, 0x20, 0x26, 0x20, 0x27, 0x10, 0xc7, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x41, 0x7f, 0x21, 0x28, 0x20, 0x04, 0x20, 0x28, 0x36, 0x02, + 0xac, 0x01, 0x0c, 0x01, 0x0b, 0x41, 0xbe, 0x96, 0x80, 0x80, 0x00, 0x21, + 0x29, 0x41, 0x00, 0x21, 0x2a, 0x20, 0x29, 0x20, 0x2a, 0x10, 0xc7, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x41, 0x88, 0x96, 0x80, 0x80, 0x00, 0x21, 0x2b, + 0x20, 0x04, 0x20, 0x2b, 0x36, 0x02, 0x94, 0x01, 0x41, 0x0d, 0x21, 0x2c, + 0x20, 0x04, 0x20, 0x2c, 0x36, 0x02, 0x90, 0x01, 0x20, 0x04, 0x28, 0x02, + 0x94, 0x01, 0x21, 0x2d, 0x20, 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, 0x2e, + 0x41, 0x01, 0x21, 0x2f, 0x41, 0x0d, 0x21, 0x30, 0x20, 0x2d, 0x20, 0x2f, + 0x20, 0x30, 0x20, 0x2e, 0x10, 0xb8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x31, + 0x20, 0x04, 0x20, 0x31, 0x36, 0x02, 0x8c, 0x01, 0x20, 0x04, 0x28, 0x02, + 0x8c, 0x01, 0x21, 0x32, 0x20, 0x04, 0x20, 0x32, 0x36, 0x02, 0x10, 0x41, + 0x8f, 0x97, 0x80, 0x80, 0x00, 0x21, 0x33, 0x41, 0x10, 0x21, 0x34, 0x20, + 0x04, 0x20, 0x34, 0x6a, 0x21, 0x35, 0x20, 0x33, 0x20, 0x35, 0x10, 0xc7, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, + 0x36, 0x41, 0x00, 0x21, 0x37, 0x20, 0x36, 0x20, 0x37, 0x20, 0x37, 0x10, + 0xdc, 0x80, 0x80, 0x80, 0x00, 0x21, 0x38, 0x20, 0x04, 0x20, 0x38, 0x36, + 0x02, 0xa0, 0x01, 0x20, 0x04, 0x28, 0x02, 0xa0, 0x01, 0x21, 0x39, 0x20, + 0x04, 0x20, 0x39, 0x36, 0x02, 0x20, 0x41, 0xfc, 0x96, 0x80, 0x80, 0x00, + 0x21, 0x3a, 0x41, 0x20, 0x21, 0x3b, 0x20, 0x04, 0x20, 0x3b, 0x6a, 0x21, + 0x3c, 0x20, 0x3a, 0x20, 0x3c, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x41, 0xe0, 0x00, 0x21, 0x3d, 0x20, 0x04, 0x20, 0x3d, 0x6a, 0x21, 0x3e, + 0x20, 0x3e, 0x21, 0x3f, 0x20, 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, 0x40, + 0x41, 0x01, 0x21, 0x41, 0x41, 0x20, 0x21, 0x42, 0x20, 0x3f, 0x20, 0x41, + 0x20, 0x42, 0x20, 0x40, 0x10, 0xde, 0x80, 0x80, 0x80, 0x00, 0x21, 0x43, + 0x20, 0x04, 0x20, 0x43, 0x36, 0x02, 0x8c, 0x01, 0x20, 0x04, 0x28, 0x02, + 0x8c, 0x01, 0x21, 0x44, 0x20, 0x04, 0x20, 0x44, 0x36, 0x02, 0x30, 0x41, + 0xa3, 0x97, 0x80, 0x80, 0x00, 0x21, 0x45, 0x41, 0x30, 0x21, 0x46, 0x20, + 0x04, 0x20, 0x46, 0x6a, 0x21, 0x47, 0x20, 0x45, 0x20, 0x47, 0x10, 0xc7, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0xe0, 0x00, 0x21, 0x48, 0x20, 0x04, + 0x20, 0x48, 0x6a, 0x21, 0x49, 0x20, 0x49, 0x21, 0x4a, 0x20, 0x04, 0x20, + 0x4a, 0x36, 0x02, 0x40, 0x41, 0x96, 0x96, 0x80, 0x80, 0x00, 0x21, 0x4b, + 0x41, 0xc0, 0x00, 0x21, 0x4c, 0x20, 0x04, 0x20, 0x4c, 0x6a, 0x21, 0x4d, + 0x20, 0x4b, 0x20, 0x4d, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, + 0x04, 0x28, 0x02, 0x98, 0x01, 0x21, 0x4e, 0x20, 0x4e, 0x10, 0xe1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, 0x21, 0x4f, 0x20, 0x04, 0x20, 0x4f, + 0x36, 0x02, 0xac, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0xac, 0x01, 0x21, + 0x50, 0x41, 0xb0, 0x01, 0x21, 0x51, 0x20, 0x04, 0x20, 0x51, 0x6a, 0x21, + 0x52, 0x20, 0x52, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x50, 0x0f, + 0x0b, 0x0b, 0xbb, 0x16, 0x02, 0x00, 0x41, 0x80, 0x08, 0x0b, 0xc0, 0x14, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x49, 0x6c, 0x6c, 0x65, + 0x67, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x00, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, + 0x61, 0x20, 0x74, 0x74, 0x79, 0x00, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x00, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x73, 0x00, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6c, 0x65, 0x66, + 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, + 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x62, + 0x75, 0x73, 0x79, 0x00, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, + 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x6c, 0x79, + 0x20, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x65, 0x65, + 0x6b, 0x00, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x2d, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x00, 0x52, 0x65, 0x61, 0x64, + 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x70, 0x65, + 0x65, 0x72, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x66, 0x75, 0x73, 0x65, 0x64, 0x00, 0x48, 0x6f, 0x73, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, + 0x65, 0x00, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x75, 0x73, 0x65, 0x00, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20, + 0x70, 0x69, 0x70, 0x65, 0x00, 0x49, 0x2f, 0x4f, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, + 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, + 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x00, + 0x49, 0x73, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x00, 0x54, 0x65, 0x78, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x62, 0x75, 0x73, 0x79, 0x00, 0x45, 0x78, 0x65, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, + 0x6f, 0x6e, 0x67, 0x00, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x00, 0x46, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, + 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x54, 0x6f, 0x6f, 0x20, 0x6d, 0x61, 0x6e, + 0x79, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x4e, + 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x00, 0x42, 0x61, 0x64, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x00, 0x4e, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x00, 0x42, 0x61, 0x64, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x74, + 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, 0x54, 0x6f, 0x6f, + 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x00, + 0x4e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x20, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, + 0x00, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, + 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x20, 0x64, 0x69, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, + 0x64, 0x00, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x00, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x00, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, + 0x65, 0x6e, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x65, 0x64, 0x00, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x42, 0x61, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x00, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, + 0x65, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x77, + 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x00, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x64, + 0x6f, 0x77, 0x6e, 0x00, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, + 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x00, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, + 0x6f, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x00, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x53, 0x74, + 0x61, 0x6c, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x00, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x00, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x68, 0x6f, 0x70, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, + 0x64, 0x00, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, + 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x75, 0x02, 0x4e, 0x00, 0xd6, 0x01, + 0xe2, 0x04, 0xb9, 0x04, 0x18, 0x01, 0x8e, 0x05, 0xed, 0x02, 0x16, 0x04, + 0xf2, 0x00, 0x97, 0x03, 0x01, 0x03, 0x38, 0x05, 0xaf, 0x01, 0x82, 0x01, + 0x4f, 0x03, 0x2f, 0x04, 0x1e, 0x00, 0xd4, 0x05, 0xa2, 0x00, 0x12, 0x03, + 0x1e, 0x03, 0xc2, 0x01, 0xde, 0x03, 0x08, 0x00, 0xac, 0x05, 0x00, 0x01, + 0x64, 0x02, 0xf1, 0x01, 0x65, 0x05, 0x34, 0x02, 0x8c, 0x02, 0xcf, 0x02, + 0x2d, 0x03, 0x4c, 0x04, 0xe3, 0x05, 0x9f, 0x02, 0xf8, 0x04, 0x1c, 0x05, + 0x08, 0x05, 0xb1, 0x02, 0x4b, 0x05, 0x15, 0x02, 0x78, 0x00, 0x52, 0x02, + 0x3c, 0x03, 0xf1, 0x03, 0xe4, 0x00, 0xc3, 0x03, 0x7d, 0x04, 0xcc, 0x00, + 0xaa, 0x03, 0x79, 0x05, 0x24, 0x02, 0x6e, 0x01, 0x6d, 0x03, 0x22, 0x04, + 0xab, 0x04, 0x44, 0x00, 0xfb, 0x01, 0xae, 0x00, 0x83, 0x03, 0x60, 0x00, + 0xe5, 0x01, 0x07, 0x04, 0x94, 0x04, 0x5e, 0x04, 0x2b, 0x00, 0x58, 0x01, + 0x39, 0x01, 0x92, 0x00, 0xc2, 0x05, 0x9b, 0x01, 0x43, 0x02, 0x46, 0x01, + 0xf6, 0x05, 0x2d, 0x2b, 0x20, 0x20, 0x20, 0x30, 0x58, 0x30, 0x78, 0x00, + 0x2d, 0x30, 0x58, 0x2b, 0x30, 0x58, 0x20, 0x30, 0x58, 0x2d, 0x30, 0x78, + 0x2b, 0x30, 0x78, 0x20, 0x30, 0x78, 0x00, 0x2f, 0x6c, 0x66, 0x73, 0x2f, + 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, + 0x74, 0x78, 0x74, 0x00, 0x2f, 0x6c, 0x66, 0x73, 0x2f, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x00, 0x6e, 0x61, 0x6e, 0x00, 0x69, 0x6e, 0x66, 0x00, + 0x72, 0x77, 0x61, 0x00, 0x4e, 0x41, 0x4e, 0x00, 0x49, 0x4e, 0x46, 0x00, + 0x2e, 0x00, 0x77, 0x2b, 0x00, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x00, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, + 0x21, 0x00, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x0a, 0x00, 0x66, 0x6f, 0x70, 0x65, + 0x6e, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x00, 0x66, 0x6f, 0x70, 0x65, 0x6e, 0x20, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x0a, 0x00, 0x6d, 0x6b, 0x64, + 0x69, 0x72, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x66, 0x73, 0x65, 0x65, + 0x6b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x25, + 0x64, 0x0a, 0x00, 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x66, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, + 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x0a, 0x54, + 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x74, 0x2c, + 0x20, 0x61, 0x64, 0x64, 0x20, 0x2d, 0x6c, 0x63, 0x2d, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x63, 0x61, 0x6e, 0x2d, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, + 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x2e, 0x0a, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, + 0x65, 0x62, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x20, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x21, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x0a, 0x00, + 0x19, 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x11, 0x0a, 0x19, 0x19, 0x19, 0x03, + 0x0a, 0x07, 0x00, 0x01, 0x1b, 0x09, 0x0b, 0x18, 0x00, 0x00, 0x09, 0x06, + 0x0b, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x19, 0x00, 0x00, 0x00, 0x19, 0x19, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x0a, 0x0d, 0x19, 0x19, 0x19, 0x00, 0x0d, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0e, 0x00, + 0x00, 0x0e, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x04, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x09, 0x12, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x1a, 0x00, + 0x00, 0x00, 0x1a, 0x1a, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x1a, + 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x00, 0x09, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x41, 0xc0, 0x1c, + 0x0b, 0xec, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x11, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x64, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 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, 0xb8, 0x0e, 0x00, 0x00, 0x00, + 0xcd, 0x0e, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x01, 0xfd, 0x0d, 0x63, 0x00, + 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, + 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2a, 0x5f, + 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, + 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x03, 0x2f, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, + 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x04, 0x35, 0x5f, 0x5f, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, + 0x74, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, + 0x73, 0x05, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x5f, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, + 0x67, 0x65, 0x74, 0x06, 0x35, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x07, 0x29, + 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, + 0x5f, 0x72, 0x65, 0x61, 0x64, 0x08, 0x29, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, + 0x09, 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, + 0x66, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x37, 0x5f, 0x5f, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x0b, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x0c, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x0d, + 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x0e, 0x2c, 0x75, 0x6e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x61, 0x6b, 0x3a, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x66, 0x69, + 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x0f, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x10, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x11, 0x08, 0x64, 0x6c, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x12, 0x04, 0x66, 0x72, 0x65, 0x65, + 0x13, 0x06, 0x64, 0x6c, 0x66, 0x72, 0x65, 0x65, 0x14, 0x06, 0x63, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x15, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x16, + 0x0b, 0x5f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, 0x64, + 0x17, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, + 0x73, 0x5f, 0x67, 0x65, 0x74, 0x18, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x19, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x1a, 0x14, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, + 0x74, 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x1b, 0x1a, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1c, + 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x70, + 0x72, 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x1d, 0x1a, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x70, 0x72, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x1e, 0x0e, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, + 0x64, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x1f, 0x0e, 0x5f, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x20, 0x0f, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x21, 0x1c, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x10, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x23, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x24, 0x05, 0x61, + 0x62, 0x6f, 0x72, 0x74, 0x25, 0x04, 0x73, 0x62, 0x72, 0x6b, 0x26, 0x05, + 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x27, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, 0x72, 0x73, + 0x28, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x29, 0x06, 0x6d, 0x65, + 0x6d, 0x73, 0x65, 0x74, 0x2a, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, + 0x2b, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x0d, 0x5f, 0x5f, 0x73, + 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x06, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x76, 0x2e, 0x0d, 0x5f, 0x5f, 0x73, 0x74, + 0x64, 0x69, 0x6f, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2f, 0x08, 0x5f, + 0x5f, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x30, 0x0e, 0x5f, 0x5f, 0x73, + 0x74, 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x31, + 0x07, 0x5f, 0x5f, 0x6c, 0x73, 0x65, 0x65, 0x6b, 0x32, 0x0c, 0x5f, 0x5f, + 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x33, 0x0a, + 0x5f, 0x5f, 0x6f, 0x66, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x34, 0x0c, + 0x5f, 0x5f, 0x6f, 0x66, 0x6c, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x35, 0x0c, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x36, 0x09, 0x5f, 0x5f, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x37, 0x09, 0x5f, 0x5f, 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x78, + 0x38, 0x06, 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x39, 0x05, 0x64, 0x75, + 0x6d, 0x6d, 0x79, 0x3a, 0x09, 0x5f, 0x5f, 0x6c, 0x63, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x3b, 0x08, 0x73, 0x74, 0x72, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3c, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, 0x3d, 0x07, 0x73, 0x74, + 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x3e, 0x07, 0x77, 0x63, 0x72, 0x74, 0x6f, + 0x6d, 0x62, 0x3f, 0x06, 0x77, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x40, 0x05, + 0x66, 0x72, 0x65, 0x78, 0x70, 0x41, 0x05, 0x66, 0x70, 0x75, 0x74, 0x73, + 0x42, 0x08, 0x76, 0x66, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x43, 0x0b, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x44, + 0x07, 0x70, 0x6f, 0x70, 0x5f, 0x61, 0x72, 0x67, 0x45, 0x03, 0x70, 0x61, + 0x64, 0x46, 0x19, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x64, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x47, 0x06, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, + 0x48, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x49, 0x06, 0x73, 0x74, + 0x72, 0x64, 0x75, 0x70, 0x4a, 0x1c, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x5f, 0x70, 0x72, 0x65, 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x4b, 0x27, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x6f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x5f, 0x66, 0x64, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x4c, 0x17, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, + 0x69, 0x62, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x6c, + 0x70, 0x61, 0x74, 0x68, 0x4d, 0x17, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x61, 0x62, + 0x73, 0x70, 0x61, 0x74, 0x68, 0x4e, 0x1e, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x6e, 0x6f, 0x63, 0x77, 0x64, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x74, 0x5f, 0x6e, 0x6f, 0x6d, 0x6f, 0x64, + 0x65, 0x4f, 0x1f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, + 0x63, 0x5f, 0x6e, 0x6f, 0x63, 0x77, 0x64, 0x5f, 0x6d, 0x6b, 0x64, 0x69, + 0x72, 0x61, 0x74, 0x5f, 0x6e, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x50, 0x16, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x51, 0x05, + 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x0b, 0x5f, 0x5f, 0x73, 0x74, 0x72, + 0x63, 0x68, 0x72, 0x6e, 0x75, 0x6c, 0x53, 0x06, 0x73, 0x74, 0x72, 0x63, + 0x68, 0x72, 0x54, 0x0c, 0x5f, 0x5f, 0x66, 0x6d, 0x6f, 0x64, 0x65, 0x66, + 0x6c, 0x61, 0x67, 0x73, 0x55, 0x05, 0x66, 0x63, 0x6e, 0x74, 0x6c, 0x56, + 0x05, 0x72, 0x65, 0x61, 0x64, 0x76, 0x57, 0x04, 0x72, 0x65, 0x61, 0x64, + 0x58, 0x0c, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x59, 0x09, 0x5f, 0x5f, 0x6f, 0x66, 0x6c, 0x5f, 0x61, 0x64, + 0x64, 0x5a, 0x08, 0x5f, 0x5f, 0x66, 0x64, 0x6f, 0x70, 0x65, 0x6e, 0x5b, + 0x05, 0x66, 0x6f, 0x70, 0x65, 0x6e, 0x5c, 0x05, 0x66, 0x73, 0x65, 0x65, + 0x6b, 0x5d, 0x08, 0x5f, 0x5f, 0x74, 0x6f, 0x72, 0x65, 0x61, 0x64, 0x5e, + 0x05, 0x66, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x06, 0x66, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x60, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x61, 0x06, 0x66, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x07, + 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x01, 0x1f, 0x47, 0x4f, 0x54, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x09, 0x11, 0x02, 0x00, 0x07, 0x2e, 0x72, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x01, 0x05, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x00, + 0x26, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x01, + 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, + 0x79, 0x01, 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x06, 0x31, 0x37, 0x2e, + 0x30, 0x2e, 0x36, 0x00, 0x39, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x03, 0x2b, 0x0b, + 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, + 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x2d, 0x65, + 0x78, 0x74 +}; \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/src/main.c b/product-mini/platforms/zephyr/simple-file/src/main.c new file mode 100644 index 0000000000..405a97f17b --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/src/main.c @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +// #include + +#include +#include +#include "bh_platform.h" +#include "bh_assert.h" +#include "bh_log.h" +#include "wasm_export.h" +#include "file.h" + +#include +#include +#include +#include +#include +#include +#include + +#define CONFIG_HEAP_MEM_POOL_SIZE WASM_GLOBAL_HEAP_SIZE +#define CONFIG_APP_STACK_SIZE 16384 +#define CONFIG_APP_HEAP_SIZE 16384 + +LOG_MODULE_REGISTER(main); + +static char global_heap_buf[CONFIG_HEAP_MEM_POOL_SIZE] = { 0 }; + +static int app_argc; +static char **app_argv; + +//-------------------------------------------------------------------------------------------// +static int +littlefs_flash_erase(unsigned int id) +{ + const struct flash_area *pfa; + int rc; + + rc = flash_area_open(id, &pfa); + if (rc < 0) { + LOG_ERR("FAIL: unable to find flash area %u: %d\n", id, rc); + return rc; + } + + LOG_PRINTK("Area %u at 0x%x on %s for %u bytes\n", id, + (unsigned int)pfa->fa_off, pfa->fa_dev->name, + (unsigned int)pfa->fa_size); + + /* Optional wipe flash contents */ + if (IS_ENABLED(CONFIG_APP_WIPE_STORAGE)) { + rc = flash_area_erase(pfa, 0, pfa->fa_size); + LOG_ERR("Erasing flash area ... %d", rc); + } + + flash_area_close(pfa); + return rc; +} +#define PARTITION_NODE DT_NODELABEL(lfs1) + +#if DT_NODE_EXISTS(PARTITION_NODE) +FS_FSTAB_DECLARE_ENTRY(PARTITION_NODE); +#else /* PARTITION_NODE */ +FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(storage); +static struct fs_mount_t lfs_storage_mnt = { + .type = FS_LITTLEFS, + .fs_data = &storage, + .storage_dev = (void *)FIXED_PARTITION_ID(storage_partition), + .mnt_point = "/lfs", +}; +#endif /* PARTITION_NODE */ + +struct fs_mount_t *mountpoint = +#if DT_NODE_EXISTS(PARTITION_NODE) + &FS_FSTAB_ENTRY(PARTITION_NODE) +#else + &lfs_storage_mnt +#endif + ; + +static int +littlefs_mount(struct fs_mount_t *mp) +{ + int rc; + + rc = littlefs_flash_erase((uintptr_t)mp->storage_dev); + if (rc < 0) { + return rc; + } + + /* Do not mount if auto-mount has been enabled */ +#if !DT_NODE_EXISTS(PARTITION_NODE) \ + || !(FSTAB_ENTRY_DT_MOUNT_FLAGS(PARTITION_NODE) & FS_MOUNT_FLAG_AUTOMOUNT) + rc = fs_mount(mp); + if (rc < 0) { + LOG_PRINTK("FAIL: mount id %" PRIuPTR " at %s: %d\n", + (uintptr_t)mp->storage_dev, mp->mnt_point, rc); + return rc; + } + LOG_PRINTK("%s mount: %d\n", mp->mnt_point, rc); +#else + LOG_PRINTK("%s automounted\n", mp->mnt_point); +#endif + + return 0; +} + +//-------------------------------------------------------------------------------------------// +int +main(void) +{ + int start, end; + start = k_uptime_get_32(); + uint8 *wasm_file_buf = NULL; + uint32 wasm_file_size; + wasm_module_t wasm_module = NULL; + wasm_module_inst_t wasm_module_inst = NULL; + RuntimeInitArgs init_args; + char error_buf[128]; + const char *exception; + int rc; + + int log_verbose_level = 2; + + memset(&init_args, 0, sizeof(RuntimeInitArgs)); + + rc = littlefs_mount(mountpoint); + if (rc < 0) { + LOG_ERR("FAIL: mounting %s: %d\n", mountpoint->mnt_point, rc); + return 0; + } + +#if WASM_ENABLE_GLOBAL_HEAP_POOL != 0 + init_args.mem_alloc_type = Alloc_With_Pool; + init_args.mem_alloc_option.pool.heap_buf = global_heap_buf; + init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf); + LOG_INF("global heap size: %d", sizeof(global_heap_buf)); +#else +#error "memory allocation scheme is not defined." +#endif + + /* initialize runtime environment */ + if (!wasm_runtime_full_init(&init_args)) { + LOG_ERR("Init runtime environment failed."); + return; + } + + /* load WASM byte buffer from byte buffer of include file */ + wasm_file_buf = (uint8 *)wasm_test_file; + wasm_file_size = sizeof(wasm_test_file); + LOG_INF("Wasm file size: %d", wasm_file_size); + + /* load WASM module */ + if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, + error_buf, sizeof(error_buf)))) { + LOG_ERR("Failed to load module: %s", error_buf); + goto fail1; + } + + /* Set the WASI context */ +#if WASM_ENABLE_LIBC_WASI != 0 +#define DIR_LIST_SIZE 1 + const char *dir_list[DIR_LIST_SIZE] = { + "/lfs", + }; + /* No dir list => No file system + * dir_cont = 0 + * No mapped dir list => No file system + * map_dir_cont = 0 + * No environment variables + * env_count = 0 + * No command line arguments + * argv 0 + */ + wasm_runtime_set_wasi_args(wasm_module, dir_list, DIR_LIST_SIZE, NULL, 0, + NULL, 0, NULL, 0); +#endif + + /* instantiate the module */ + if (!(wasm_module_inst = wasm_runtime_instantiate( + wasm_module, CONFIG_APP_STACK_SIZE, CONFIG_APP_HEAP_SIZE, + error_buf, sizeof(error_buf)))) { + LOG_ERR("Failed to instantiate module: %s", error_buf); + goto fail2; + } + + /* invoke the main function */ + if (wasm_runtime_lookup_function(wasm_module_inst, "_start") + || wasm_runtime_lookup_function(wasm_module_inst, "__main_argc_argv") + || wasm_runtime_lookup_function(wasm_module_inst, "main")) { + + LOG_INF("main found"); + wasm_application_execute_main(wasm_module_inst, 0, NULL); + LOG_INF("main executed"); + } + else { + LOG_ERR("Failed to lookup function main"); + return -1; + } + + if ((exception = wasm_runtime_get_exception(wasm_module_inst))) + LOG_ERR("get exception: %s", exception); + + rc = wasm_runtime_get_wasi_exit_code(wasm_module_inst); + LOG_INF("wasi exit code: %d", rc); + + /* destroy the module instance */ + wasm_runtime_deinstantiate(wasm_module_inst); + +fail2: + /* unload the module */ + wasm_runtime_unload(wasm_module); + +fail1: + /* destroy runtime environment */ + wasm_runtime_destroy(); + + end = k_uptime_get_32(); + + LOG_INF("elapsed: %dms", (end - start)); + + return 0; +} \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-file/to_c_header.py b/product-mini/platforms/zephyr/simple-file/to_c_header.py new file mode 100644 index 0000000000..7712c0b5ab --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/to_c_header.py @@ -0,0 +1,32 @@ +# Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Python script to convert wasm file to byte array in a .h file +import os + +CWD = os.getcwd() +CMAKE_CURRENT_BINARY_DIR = os.getenv('CMAKE_CURRENT_BINARY_DIR', CWD) +CMAKE_CURRENT_SOURCE_DIR = os.getenv('CMAKE_CURRENT_SOURCE_DIR', f'{CWD}/../src') + +LICENCE_HEADER = """/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ +""" + +print('CMAKE_CURRENT_BINARY_DIR:', CMAKE_CURRENT_BINARY_DIR) +print('CMAKE_CURRENT_SOURCE_DIR:', CMAKE_CURRENT_SOURCE_DIR) + +# Open the wasm file in binary mode and read the data +with open(f'{CWD}/wasm-apps/file.wasm', 'rb') as f: + wasm_bytes = f.read() + +# Convert the bytes to a comma-separated string of hex values +byte_array = ', '.join(f'0x{byte:02x}' for byte in wasm_bytes) + +# Create the output string +output = f'{LICENCE_HEADER}\nunsigned char __aligned(4) wasm_test_file[] = {{ {byte_array} }};' + +# Write the output string to the .h file +with open(f'{CWD}/src/file.h', 'w') as f: + f.write(output) diff --git a/product-mini/platforms/zephyr/simple-file/wasm-apps/file.c b/product-mini/platforms/zephyr/simple-file/wasm-apps/file.c new file mode 100644 index 0000000000..be25e55166 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-file/wasm-apps/file.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include +#include +#include +#include +#include + +// Zephyr +#define CWD "/lfs" +#define FOLDER_PATH CWD "/folder" +#define FILE_PATH CWD "folder/test.txt" + +int +main(int argc, char **argv) +{ + int rc; + const int zero = 0; + printf("Hello WebAssembly Module !\n"); + + rc = mkdir(FOLDER_PATH, 0777); + if (rc < 0) { + rc = errno; + printf("mkdir failed with error %d\n", rc); + return -1; + } + printf("mkdir returned %d\n", rc); + + FILE *file = fopen(FILE_PATH, "w+"); + if (!file) { + printf("fopen Failed to open\n"); + return -1; + } + printf("fopen Succeed\n"); + + const char *data = "Hello, World!"; + size_t len = 13; + size_t nitems = fwrite(data, sizeof(char), 13, file); + printf("fwrite returned %d\n", (int)nitems); + + rc = fseek(file, 0, SEEK_SET); + printf("fseek returned %d\n", rc); + + char buffer[32]; + nitems = fread(buffer, sizeof(char), 32, file); + printf("fread returned %d\n", (int)nitems); + printf("buffer read = %s\n", buffer); + + fclose(file); + + return 0; +} diff --git a/product-mini/platforms/zephyr/simple-http/CMakeLists.txt b/product-mini/platforms/zephyr/simple-http/CMakeLists.txt new file mode 100644 index 0000000000..e0236c04c1 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/CMakeLists.txt @@ -0,0 +1,89 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required(VERSION 3.8.2) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(wamr) + +enable_language (ASM) + +set (WAMR_BUILD_PLATFORM "zephyr") + +# WAMR Configuration: +set (WAMR_BUILD_TARGET "THUMB") +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_AOT 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) # printf +set (WAMR_BUILD_LIBC_WASI 1) +set (WAMR_BUILD_LIB_PTHREAD 0) +set (WAMR_BUILD_GLOBAL_HEAP_POOL 1) +set (WAMR_BUILD_GLOBAL_HEAP_SIZE 98304) # 96 KB + +# Environment variables: + +# Check if WAMR_ROOT_DIR is set +if(DEFINED ENV{WAMR_ROOT_DIR}) + set(WAMR_ROOT_DIR $ENV{WAMR_ROOT_DIR}) +else() + message(FATAL_ERROR "'WAMR_ROOT_DIR' need to be specified") +endif() +message("wasi-sdk was found at ${WAMR_ROOT_DIR}") + +# Check if WASI_SDK_PATH is set +if(NOT $ENV{WASI_SDK_PATH} STREQUAL "") + set(WASI_SDK_PATH $ENV{WASI_SDK_PATH}) +else() + find_program(WASM_C_COMPILER clang /opt/wasi-sdk/bin NO_DEFAULT_PATH) + if(NOT WASM_C_COMPILER) + message(FATAL_ERROR "'wasi-sdk' not found, please ensure wasi-sdk is installed.\ + You can download and install it from\ + https://github.com/WebAssembly/wasi-sdk/releases") + else() + set(WASI_SDK_PATH /opt/wasi-sdk) + endif() +endif() +message("wasi-sdk was found at ${WASI_SDK_PATH}") + +# Check if WAMR_APP_FRAMEWORK_DIR is set +if (DEFINED ENV{WAMR_APP_FRAMEWORK_DIR}) + set(WAMR_APP_FRAMEWORK_DIR $ENV{WAMR_APP_FRAMEWORK_DIR}) +else() + message(FATAL_ERROR "'wamr-app-framework' not found, please ensure they are installed.\ + You can download and install them from\ + https://github.com/bytecodealliance/wamr-app-framework") +endif() +message("wamr-app-framework was found at ${WAMR_APP_FRAMEWORK_DIR}") + +# set the WAMR_SDK_DIR with the path specified in the environment variable +set(WAMR_SDK_DIR + ${WAMR_APP_FRAMEWORK_DIR}/wamr-sdk +) + +# set the WAMR_LIBC_BUILTIN_DIR +set(WAMR_LIBC_BUILTIN_DIR + ${WAMR_SDK_DIR}/wamr-sdk/app/libc-builtin-sysroot +) + +# set the WAMR_SDK_PACKAGE_OUT_DIR +set(WAMR_SDK_PACKAGE_OUT_DIR + ${CMAKE_CURRENT_BINARY_DIR}/wamr-sdk/app-sdk/wamr-app-framework +) + +# # Reset linker flags +# set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +# set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) +# include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) # in socket-api sample + +# Build the WAMR runtime +target_sources(app PRIVATE + ${WAMR_RUNTIME_LIB_SOURCE} + src/main.c) + +# Link libraries like in samples. +set(WASI_LIBM "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libm.a") +set(WASI_LIBDL "${WASI_SDK_PATH}/share/wasi-sysroot/lib/wasm32-wasi/libdl.a") + +target_link_libraries(app PUBLIC ${WASI_LIBM} ${WASI_LIBDL}) \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/README.md b/product-mini/platforms/zephyr/simple-http/README.md new file mode 100644 index 0000000000..040c959a7c --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/README.md @@ -0,0 +1,143 @@ +# Socket sample +this sample demonstrates the use of WASI API to interact with sockets. + +> ❗ **Important:** This sample was ported/adapted from the http_get zephyr sample. The original sample can be found [here]( https://github.com/zephyrproject-rtos/zephyr/blob/main/samples/net/sockets/http_get/src/http_get.c). + +> 🛠️ **Work in progress:** The sample is functional but be aware that just a small part of WASI socket API was tested. +> Actual Zephyr APIs: +> * socket creation = `zsock_socket` +> * socket connection = `zsock_connect` +> * socket emission = `zsock_sendto` +> * socket reception = `zsock_recvfrom` +> * socket destruction = `zsock_close` +> +> With the sockets most API are in fact provided by the runtime instead of WASI because of the lack of socket support in WASI preview1. + +## Setup +1. Connect a network cable to the board ethernet port. +2. Configure the network interface on the host machine + ``` + Internet Protocol Version 4 (TCP/IPv4) Properties: + IP Address: 192.0.2.10 + Subnet Mask: 255.255.255.0 + Default Gateway: 192.0.2.2 + ``` +3. Start a simple HTTP server on the host machine. + ```bash + python3 -m http.server --bind 0.0.0.0 + ``` +4. Disable any firewall that may block the connection. + +## Configuration +To configure the server side IP address and port modify the following lines in the `http_get.c` file. + +1. The `HTTP_HOST` and `HTTP_PORT` macros define the server IP address and port. + ```c + /* HTTP server to connect to */ + #define HTTP_HOST "192.0.2.10" + /* Port to connect to, as string */ + #define HTTP_PORT "8000" + /* HTTP path to request */ + #define HTTP_PATH "/" + + // ... + + #define REQUEST "GET " HTTP_PATH " HTTP/1.0\r\nHost: " HTTP_HOST "\r\n\r\n" + ``` + > 📄 **Notes:** These macros are used to build the request string, but they are not used to instantiate the address structure. Because at one point we didn't want to use `inet_pton` to convert the string to an address and it remained like this. + +2. The `addr` structure is used to store the server address. + ```c + addr.sin_port = htons(8000); + addr.sin_addr.s_addr = + htonl(0xC000020A); // hard coded IP address for 192.0.2.10 + ``` + +To configure the authorized IP address(es) modify the following lines in the `main.c` file. WAMR will only allow the IP addresses in the pool to connect to the server. +```c +#define ADDRESS_POOL_SIZE 1 + const char *addr_pool[ADDRESS_POOL_SIZE] = { + "192.0.2.10/24", + }; +``` +## Run Command +* **Zephyr Build** + 1. **Build:** Replace `nucleo_h743zi` with your board name and the `WAMR_BUILD_TARGET` in `CMakeList.txt` with your target architecture. + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr \ + WAMR_ROOT_DIR=~/wasm-micro-runtime \ + WASI_SDK_PATH=~/wasi-sdk-21.0 \ + WAMR_APP_FRAMEWORK_DIR=~/wamr-app-framework \ + west build . -b nucleo_h563zi -p always + ``` + ⚠️ **Warning:** The flags `ZEPHYR_BASE`, `WAMR_ROOT_DIR`, `WASI_SDK_PATH`, and `WAMR_APP_FRAMEWORK_DIR` need to be set otherwise the build will fail. + + 2. **Flash:** + ```bash + ZEPHYR_BASE=~/zephyrproject/zephyr west flash + ``` + + 3. **Monitor:** Use a serial link to monitor the output. Personally, I use minicom. + ```bash + minicom -D /dev/ttyACM0 + ``` + + 4. **Debug:** Curently investigating. + +* **WebAssembly Module** + + ❗ **Important:** I used wasi-sdk 21 to compile the module. I still haven't tried the module with the new wasi-sdk 22. + + 0. **Compile a static lib:** in the `wasm-apps` folder. + * **Compile the an object:** + ```bash + ~/wasi-sdk-21.0/bin/clang --sysroot=/home/user/wasi-sdk-21.0/share/wasi-sysroot -Iinc/ -c inc/wasi_socket_ext.c -o inc/wasi_socket_ext.o + ``` + * **Create a static lib:** + ```bash + ~/wasi-sdk-21.0/bin/llvm-ar rcs inc/libwasi_socket_ext.a inc/wasi_socket_ext.o + ``` + 1. **Compile:** in the `wasm-apps` folder. + ```bash + ~/wasi-sdk-21.0/bin/clang --sysroot=/home/user/wasi-sdk-21.0/share/wasi-sysroot -Iinc/ -nodefaultlibs -o http_get.wasm http_get.c -lc -Linc/ -lwasi_socket_ext -z stack-size=8192 -Wl,--initial-memory=65536 -Wl,--export=__heap_base -Wl,--export=__data_end -Wl,--allow-undefined + ``` + 2. **generate a C header:** Use `xxd` or other tool, I also put simple python script. At application root `simple-http/`. + ```bash + python3 to_c_header.py + ``` + Be free to modify the script to fit your needs. + +## Output +The output should be similar to the following: +```bash +*** Booting Zephyr OS build v3.6.0-4305-g2ec8f442a505 *** +[00:00:00.061,000] net_config: Initializing network +[00:00:00.067,000] net_config: Waiting interface 1 (0x2000a910) to be up... +[00:00:03.158,000] phy_mii: PHY (0) Link speed 100 Mb, full duplex + +[00:00:03.288,000] net_config: Interface 1 (0x2000a910) coming up +[00:00:03.295,000] net_config: IPv4 address: 192.0.2.1 +global heap size: 131072 +Wasm file size: 36351 +main found +[wasm-mod] Preparing HTTP GET request for http://192.0.2.10:8000/ +[wasm-mod] sock = 3 +[wasm-mod] connect rc = 0 +[wasm-mod] send rc = 36 +[wasm-mod] Response: + +HTTP/1.0 200 OK +Server: SimpleHTTP/0.6 Python/3.10.10 +Date: Fri, 14 Jun 2024 07:26:56 GMT +Content-type: text/html; charset=utf-8 +Content-Length: 2821 + +# Skip the HTML content + +[wasm-mod] len = 0 break + +[wasm-mod] Connection closed +main executed +wasi exit code: 0 +elapsed: 405ms +``` \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/prj.conf b/product-mini/platforms/zephyr/simple-http/prj.conf new file mode 100644 index 0000000000..c6f6ff48d3 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/prj.conf @@ -0,0 +1,61 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Log config +CONFIG_PRINTK=y +CONFIG_LOG=y +CONFIG_LOG_MODE_IMMEDIATE=y +CONFIG_NET_LOG=y + +CONFIG_MAIN_STACK_SIZE=8192 +# CONFIG_HEAP_MEM_POOL_SIZE=32768 +CONFIG_REQUIRES_FULL_LIBC=y + +# Networking config +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_IPV6=y +CONFIG_NET_TCP=y +CONFIG_NET_SOCKETS=y +CONFIG_POSIX_API=n + +# Stack conf +# CONFIG_NO_OPTIMIZATIONS=y +CONFIG_STACK_SENTINEL=y +CONFIG_HW_STACK_PROTECTION=y +# CONFIG_STACK_CANARIES=y +# CONFIG_ISR_STACK_SIZE=4096 + +# Network driver config +CONFIG_TEST_RANDOM_GENERATOR=y + +# Network address config +CONFIG_NET_CONFIG_SETTINGS=y +CONFIG_NET_CONFIG_NEED_IPV4=y +CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1" +CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2" +CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2" + +# Config File System +CONFIG_FILE_SYSTEM=y +CONFIG_FILE_SYSTEM_LITTLEFS=y +# Flash +CONFIG_FLASH=y +CONFIG_FLASH_MAP=y + +# CONFIG_DNS_RESOLVER=y +# CONFIG_DNS_SERVER_IP_ADDRESSES=y +# CONFIG_DNS_SERVER1="192.0.2.2" + +# Config init stack +# CONFIG_INIT_STACKS=y +# CONFIG_NET_PKT_RX_COUNT=100 +# CONFIG_NET_PKT_TX_COUNT=100 +# CONFIG_NET_BUF_RX_COUNT=100 +# CONFIG_NET_BUF_TX_COUNT=100 + +# Flash +CONFIG_FLASH=y + +# Debug +CONFIG_DEBUG=y \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/src/http_get.h b/product-mini/platforms/zephyr/simple-http/src/http_get.h new file mode 100644 index 0000000000..0b7dcc8704 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/src/http_get.h @@ -0,0 +1,3039 @@ +/* + * Copyright (c) 2017 Linaro Limited + * Copyright (C) 2024 Grenoble INP - ESISAR Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +unsigned char __aligned(4) wasm_test_file[] = { + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x68, 0x10, 0x60, + 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, + 0x7e, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x01, 0x7f, + 0x60, 0x04, 0x7f, 0x7e, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, + 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x06, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x00, 0x01, + 0x7f, 0x60, 0x02, 0x7c, 0x7f, 0x01, 0x7c, 0x60, 0x05, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x00, 0x60, 0x05, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f, + 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x00, 0x02, 0xb4, 0x03, 0x0c, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x61, 0x72, + 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, 0x72, 0x67, 0x73, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x02, + 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, + 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x00, 0x03, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0d, 0x66, 0x64, + 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x00, + 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, + 0x07, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x00, 0x04, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x66, 0x64, + 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x00, 0x05, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, + 0x5f, 0x65, 0x78, 0x69, 0x74, 0x00, 0x06, 0x16, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x73, 0x6f, 0x63, 0x6b, 0x5f, + 0x72, 0x65, 0x63, 0x76, 0x00, 0x07, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x0c, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0c, 0x73, 0x6f, 0x63, 0x6b, + 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x00, 0x07, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x73, 0x6f, + 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x00, 0x07, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x09, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x00, + 0x05, 0x03, 0x4c, 0x4b, 0x08, 0x08, 0x02, 0x03, 0x03, 0x06, 0x06, 0x02, + 0x06, 0x09, 0x08, 0x03, 0x02, 0x02, 0x03, 0x02, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x03, 0x08, 0x08, 0x03, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x01, 0x01, 0x09, 0x08, 0x03, 0x00, 0x05, 0x02, 0x02, 0x03, 0x00, 0x02, + 0x0a, 0x02, 0x00, 0x0b, 0x0c, 0x0d, 0x08, 0x00, 0x00, 0x03, 0x00, 0x02, + 0x00, 0x0e, 0x05, 0x03, 0x03, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x02, 0x07, + 0x07, 0x07, 0x07, 0x00, 0x05, 0x0f, 0x0f, 0x04, 0x05, 0x01, 0x70, 0x01, + 0x05, 0x05, 0x05, 0x03, 0x01, 0x00, 0x01, 0x06, 0x1a, 0x04, 0x7f, 0x01, + 0x41, 0xc0, 0xf4, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x7f, 0x00, + 0x41, 0xc0, 0xf4, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0xb4, 0x34, 0x0b, 0x07, + 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x06, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0d, 0x0b, 0x5f, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x03, 0x02, 0x0a, 0x5f, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x64, 0x03, 0x03, 0x09, + 0x0a, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x04, 0x29, 0x27, 0x2b, 0x2d, 0x0a, + 0x81, 0xf1, 0x01, 0x4b, 0x02, 0x00, 0x0b, 0x52, 0x01, 0x01, 0x7f, 0x02, + 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0x9f, + 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xf0, 0x9f, 0x80, 0x80, 0x00, 0x6a, 0x41, 0x01, + 0x36, 0x02, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x10, 0x95, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x00, 0x10, 0xa3, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x0d, 0x01, 0x0f, 0x0b, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x10, 0x9e, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0xfa, 0x07, 0x03, 0x07, 0x7f, 0x01, + 0x7e, 0x5d, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, + 0x90, 0x01, 0x21, 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x21, 0x04, 0x20, + 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x21, 0x05, 0x20, + 0x04, 0x20, 0x05, 0x36, 0x02, 0x8c, 0x01, 0x20, 0x04, 0x20, 0x00, 0x36, + 0x02, 0x88, 0x01, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x84, 0x01, 0x41, + 0x00, 0x21, 0x06, 0x20, 0x04, 0x20, 0x06, 0x36, 0x02, 0x5c, 0x41, 0xca, + 0x8a, 0x80, 0x80, 0x00, 0x21, 0x07, 0x41, 0x00, 0x21, 0x08, 0x20, 0x07, + 0x20, 0x08, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x42, 0x00, 0x21, + 0x09, 0x20, 0x04, 0x20, 0x09, 0x37, 0x03, 0x68, 0x20, 0x04, 0x20, 0x09, + 0x37, 0x03, 0x60, 0x41, 0x01, 0x21, 0x0a, 0x20, 0x04, 0x20, 0x0a, 0x3b, + 0x01, 0x60, 0x41, 0xc0, 0x3e, 0x21, 0x0b, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x0c, 0x20, 0x0b, 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x20, 0x0d, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x0e, 0x20, 0x04, 0x20, 0x0e, 0x3b, 0x01, + 0x62, 0x41, 0x8a, 0x84, 0x80, 0x80, 0x7c, 0x21, 0x0f, 0x20, 0x0f, 0x10, + 0xa4, 0x80, 0x80, 0x80, 0x00, 0x21, 0x10, 0x20, 0x04, 0x20, 0x10, 0x36, + 0x02, 0x64, 0x41, 0x01, 0x21, 0x11, 0x41, 0x06, 0x21, 0x12, 0x20, 0x11, + 0x20, 0x12, 0x20, 0x12, 0x10, 0xd3, 0x80, 0x80, 0x80, 0x00, 0x21, 0x13, + 0x20, 0x04, 0x20, 0x13, 0x36, 0x02, 0x7c, 0x20, 0x04, 0x28, 0x02, 0x7c, + 0x21, 0x14, 0x20, 0x04, 0x20, 0x14, 0x36, 0x02, 0x30, 0x41, 0xff, 0x89, + 0x80, 0x80, 0x00, 0x21, 0x15, 0x41, 0x30, 0x21, 0x16, 0x20, 0x04, 0x20, + 0x16, 0x6a, 0x21, 0x17, 0x20, 0x15, 0x20, 0x17, 0x10, 0xa6, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, 0x18, 0x41, 0xe0, + 0x00, 0x21, 0x19, 0x20, 0x04, 0x20, 0x19, 0x6a, 0x21, 0x1a, 0x20, 0x1a, + 0x21, 0x1b, 0x41, 0x10, 0x21, 0x1c, 0x20, 0x18, 0x20, 0x1b, 0x20, 0x1c, + 0x10, 0xcd, 0x80, 0x80, 0x80, 0x00, 0x21, 0x1d, 0x20, 0x04, 0x20, 0x1d, + 0x36, 0x02, 0x5c, 0x20, 0x04, 0x28, 0x02, 0x5c, 0x21, 0x1e, 0x20, 0x04, + 0x20, 0x1e, 0x36, 0x02, 0x40, 0x41, 0x95, 0x8a, 0x80, 0x80, 0x00, 0x21, + 0x1f, 0x41, 0xc0, 0x00, 0x21, 0x20, 0x20, 0x04, 0x20, 0x20, 0x6a, 0x21, + 0x21, 0x20, 0x1f, 0x20, 0x21, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, 0x22, 0x41, 0xb3, 0x8c, 0x80, 0x80, + 0x00, 0x21, 0x23, 0x41, 0x24, 0x21, 0x24, 0x41, 0x00, 0x21, 0x25, 0x41, + 0xe0, 0x00, 0x21, 0x26, 0x20, 0x04, 0x20, 0x26, 0x6a, 0x21, 0x27, 0x20, + 0x27, 0x21, 0x28, 0x41, 0x10, 0x21, 0x29, 0x20, 0x22, 0x20, 0x23, 0x20, + 0x24, 0x20, 0x25, 0x20, 0x28, 0x20, 0x29, 0x10, 0xcf, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x2a, 0x20, 0x04, 0x20, 0x2a, 0x36, 0x02, 0x5c, 0x20, 0x04, + 0x28, 0x02, 0x5c, 0x21, 0x2b, 0x20, 0x04, 0x20, 0x2b, 0x36, 0x02, 0x50, + 0x41, 0xb1, 0x8a, 0x80, 0x80, 0x00, 0x21, 0x2c, 0x41, 0xd0, 0x00, 0x21, + 0x2d, 0x20, 0x04, 0x20, 0x2d, 0x6a, 0x21, 0x2e, 0x20, 0x2c, 0x20, 0x2e, + 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x5c, + 0x21, 0x2f, 0x41, 0x00, 0x21, 0x30, 0x20, 0x2f, 0x21, 0x31, 0x20, 0x30, + 0x21, 0x32, 0x20, 0x31, 0x20, 0x32, 0x48, 0x21, 0x33, 0x41, 0x01, 0x21, + 0x34, 0x20, 0x33, 0x20, 0x34, 0x71, 0x21, 0x35, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x35, 0x45, 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, + 0x36, 0x20, 0x36, 0x28, 0x02, 0x00, 0x21, 0x37, 0x20, 0x04, 0x20, 0x37, + 0x36, 0x02, 0x00, 0x41, 0xea, 0x89, 0x80, 0x80, 0x00, 0x21, 0x38, 0x20, + 0x38, 0x20, 0x04, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, + 0x21, 0x39, 0x20, 0x04, 0x20, 0x39, 0x36, 0x02, 0x8c, 0x01, 0x0c, 0x01, + 0x0b, 0x41, 0xd8, 0x8c, 0x80, 0x80, 0x00, 0x21, 0x3a, 0x41, 0x00, 0x21, + 0x3b, 0x20, 0x3a, 0x20, 0x3b, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x03, 0x40, 0x41, 0x10, 0x21, 0x3c, 0x20, 0x04, 0x20, 0x3c, 0x36, 0x02, + 0x58, 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, 0x3d, 0x41, 0x80, 0xa0, 0x80, + 0x80, 0x00, 0x21, 0x3e, 0x41, 0xff, 0x07, 0x21, 0x3f, 0x41, 0x00, 0x21, + 0x40, 0x41, 0xe0, 0x00, 0x21, 0x41, 0x20, 0x04, 0x20, 0x41, 0x6a, 0x21, + 0x42, 0x20, 0x42, 0x21, 0x43, 0x41, 0xd8, 0x00, 0x21, 0x44, 0x20, 0x04, + 0x20, 0x44, 0x6a, 0x21, 0x45, 0x20, 0x45, 0x21, 0x46, 0x20, 0x3d, 0x20, + 0x3e, 0x20, 0x3f, 0x20, 0x40, 0x20, 0x43, 0x20, 0x46, 0x10, 0xd1, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x47, 0x20, 0x04, 0x20, 0x47, 0x36, 0x02, 0x54, + 0x20, 0x04, 0x28, 0x02, 0x54, 0x21, 0x48, 0x41, 0x00, 0x21, 0x49, 0x20, + 0x48, 0x21, 0x4a, 0x20, 0x49, 0x21, 0x4b, 0x20, 0x4a, 0x20, 0x4b, 0x48, + 0x21, 0x4c, 0x41, 0x01, 0x21, 0x4d, 0x20, 0x4c, 0x20, 0x4d, 0x71, 0x21, + 0x4e, 0x02, 0x40, 0x20, 0x4e, 0x45, 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x4f, 0x20, 0x4f, 0x28, 0x02, 0x00, 0x21, 0x50, 0x20, + 0x04, 0x20, 0x50, 0x36, 0x02, 0x10, 0x41, 0xea, 0x89, 0x80, 0x80, 0x00, + 0x21, 0x51, 0x41, 0x10, 0x21, 0x52, 0x20, 0x04, 0x20, 0x52, 0x6a, 0x21, + 0x53, 0x20, 0x51, 0x20, 0x53, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x41, 0x00, 0x21, 0x54, 0x20, 0x04, 0x20, 0x54, 0x36, 0x02, 0x8c, 0x01, + 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x54, 0x21, 0x55, 0x41, 0x00, + 0x21, 0x56, 0x20, 0x55, 0x20, 0x56, 0x3a, 0x00, 0x80, 0xa0, 0x80, 0x80, + 0x00, 0x41, 0x80, 0xa0, 0x80, 0x80, 0x00, 0x21, 0x57, 0x20, 0x04, 0x20, + 0x57, 0x36, 0x02, 0x20, 0x41, 0x9d, 0x88, 0x80, 0x80, 0x00, 0x21, 0x58, + 0x41, 0x20, 0x21, 0x59, 0x20, 0x04, 0x20, 0x59, 0x6a, 0x21, 0x5a, 0x20, + 0x58, 0x20, 0x5a, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, + 0x28, 0x02, 0x54, 0x21, 0x5b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x5b, 0x0d, + 0x00, 0x41, 0xb2, 0x89, 0x80, 0x80, 0x00, 0x21, 0x5c, 0x41, 0x00, 0x21, + 0x5d, 0x20, 0x5c, 0x20, 0x5d, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0c, 0x01, 0x0b, 0x0c, 0x01, 0x0b, 0x0b, 0x41, 0xed, 0x8c, 0x80, 0x80, + 0x00, 0x21, 0x5e, 0x41, 0x00, 0x21, 0x5f, 0x20, 0x5e, 0x20, 0x5f, 0x10, + 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x04, 0x28, 0x02, 0x7c, 0x21, + 0x60, 0x20, 0x60, 0x10, 0x97, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0xcc, + 0x89, 0x80, 0x80, 0x00, 0x21, 0x61, 0x41, 0x00, 0x21, 0x62, 0x20, 0x61, + 0x20, 0x62, 0x10, 0xa6, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x41, 0x00, 0x21, + 0x63, 0x20, 0x04, 0x20, 0x63, 0x36, 0x02, 0x8c, 0x01, 0x0b, 0x20, 0x04, + 0x28, 0x02, 0x8c, 0x01, 0x21, 0x64, 0x41, 0x90, 0x01, 0x21, 0x65, 0x20, + 0x04, 0x20, 0x65, 0x6a, 0x21, 0x66, 0x20, 0x66, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x64, 0x0f, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x90, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0xab, 0x32, 0x01, 0x0b, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x02, + 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xdc, 0xab, 0x80, 0x80, + 0x00, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x42, 0x7f, 0x37, 0x02, 0xe8, + 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, + 0x80, 0xc0, 0x00, 0x37, 0x02, 0xe0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x01, 0x41, 0x08, 0x6a, 0x41, 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, + 0xaa, 0x05, 0x73, 0x22, 0x03, 0x36, 0x02, 0xdc, 0xab, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xf0, 0xab, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x36, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x0b, 0x41, + 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x49, + 0x0d, 0x01, 0x41, 0x00, 0x21, 0x02, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, + 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, 0x41, 0xd9, 0x00, 0x49, 0x0d, + 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, + 0x00, 0x36, 0x02, 0xc4, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0xc0, + 0xf4, 0x80, 0x80, 0x00, 0x36, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x03, 0x36, 0x02, 0xa8, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x7f, 0x36, 0x02, 0xa4, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, + 0x80, 0x80, 0x84, 0x80, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, + 0x36, 0x02, 0xc8, 0xab, 0x80, 0x80, 0x00, 0x03, 0x40, 0x20, 0x04, 0x41, + 0xc0, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xb4, 0xa8, 0x80, + 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, + 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, 0x00, + 0x20, 0x04, 0x41, 0xb8, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x05, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x41, 0xc8, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, + 0x04, 0x41, 0xbc, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x36, 0x02, + 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xd0, + 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xc4, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x41, 0xcc, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x22, 0x04, 0x41, + 0x80, 0x02, 0x47, 0x0d, 0x00, 0x0b, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, + 0x41, 0x78, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, 0x41, 0x0f, 0x71, + 0x22, 0x04, 0x6a, 0x22, 0x02, 0x41, 0x04, 0x6a, 0x41, 0x80, 0x80, 0x84, + 0x80, 0x00, 0x41, 0xc0, 0xf4, 0x80, 0x80, 0x00, 0x6b, 0x41, 0x48, 0x6a, + 0x22, 0x03, 0x20, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xec, 0xab, 0x80, 0x80, 0x00, + 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x04, 0x36, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x02, 0x36, 0x02, + 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x41, 0xc0, 0xf4, 0x80, 0x80, + 0x00, 0x6a, 0x41, 0x04, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x00, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0xec, 0x01, 0x4b, 0x0d, 0x00, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x06, + 0x41, 0x10, 0x20, 0x00, 0x41, 0x13, 0x6a, 0x41, 0x70, 0x71, 0x20, 0x00, + 0x41, 0x0b, 0x49, 0x1b, 0x22, 0x07, 0x41, 0x03, 0x76, 0x22, 0x03, 0x76, + 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x04, 0x41, 0x01, 0x71, 0x20, 0x03, 0x72, 0x41, 0x01, 0x73, 0x22, + 0x05, 0x41, 0x03, 0x74, 0x22, 0x03, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, + 0x6a, 0x22, 0x04, 0x20, 0x03, 0x41, 0xb4, 0xa8, 0x80, 0x80, 0x00, 0x6a, + 0x28, 0x02, 0x00, 0x22, 0x03, 0x28, 0x02, 0x08, 0x22, 0x07, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x06, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, + 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, + 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x0b, + 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, + 0x03, 0x74, 0x22, 0x05, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, + 0x20, 0x05, 0x6a, 0x22, 0x03, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x0c, 0x12, 0x0b, 0x20, 0x07, 0x41, 0x00, 0x28, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x08, 0x4d, 0x0d, 0x01, 0x02, + 0x40, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, + 0x20, 0x03, 0x74, 0x41, 0x02, 0x20, 0x03, 0x74, 0x22, 0x04, 0x41, 0x00, + 0x20, 0x04, 0x6b, 0x72, 0x71, 0x68, 0x22, 0x03, 0x41, 0x03, 0x74, 0x22, + 0x04, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, 0x20, 0x04, + 0x41, 0xb4, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, + 0x28, 0x02, 0x08, 0x22, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x06, + 0x41, 0x7e, 0x20, 0x03, 0x77, 0x71, 0x22, 0x06, 0x36, 0x02, 0x84, 0xa8, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x08, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x0b, 0x20, 0x04, 0x20, + 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x04, 0x20, 0x03, 0x41, + 0x03, 0x74, 0x22, 0x03, 0x6a, 0x20, 0x03, 0x20, 0x07, 0x6b, 0x22, 0x05, + 0x36, 0x02, 0x00, 0x20, 0x04, 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, 0x05, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, 0x08, 0x45, 0x0d, + 0x00, 0x20, 0x08, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, 0x06, 0x41, 0x01, 0x20, 0x08, + 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x06, 0x20, 0x09, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x07, 0x21, 0x09, 0x0c, 0x01, 0x0b, 0x20, 0x07, 0x28, 0x02, 0x08, 0x21, + 0x09, 0x0b, 0x20, 0x09, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, + 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, + 0x03, 0x20, 0x09, 0x36, 0x02, 0x08, 0x0b, 0x20, 0x04, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, + 0x0c, 0x12, 0x0b, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, + 0x22, 0x0a, 0x45, 0x0d, 0x01, 0x20, 0x0a, 0x68, 0x41, 0x02, 0x74, 0x41, + 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, + 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x21, 0x03, 0x20, 0x00, + 0x21, 0x05, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, + 0x10, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x14, 0x6a, 0x28, 0x02, + 0x00, 0x22, 0x04, 0x45, 0x0d, 0x02, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, 0x05, 0x20, 0x03, 0x20, 0x05, + 0x20, 0x03, 0x49, 0x22, 0x05, 0x1b, 0x21, 0x03, 0x20, 0x04, 0x20, 0x00, + 0x20, 0x05, 0x1b, 0x21, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x28, 0x02, 0x18, 0x21, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x0c, 0x22, 0x09, 0x20, 0x00, 0x46, 0x0d, 0x00, 0x20, 0x00, + 0x28, 0x02, 0x08, 0x22, 0x04, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa8, 0x80, + 0x80, 0x00, 0x49, 0x1a, 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, + 0x04, 0x20, 0x09, 0x36, 0x02, 0x0c, 0x0c, 0x11, 0x0b, 0x02, 0x40, 0x20, + 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, + 0x00, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x04, 0x20, + 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, + 0x02, 0x20, 0x04, 0x22, 0x09, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, + 0x00, 0x22, 0x04, 0x0d, 0x00, 0x20, 0x09, 0x41, 0x10, 0x6a, 0x21, 0x05, + 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x20, 0x02, + 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x10, 0x0b, 0x41, 0x7f, 0x21, 0x07, + 0x20, 0x00, 0x41, 0xbf, 0x7f, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x13, + 0x6a, 0x22, 0x04, 0x41, 0x70, 0x71, 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, + 0x88, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x0b, 0x45, 0x0d, 0x00, 0x41, 0x00, + 0x21, 0x08, 0x02, 0x40, 0x20, 0x07, 0x41, 0x80, 0x02, 0x49, 0x0d, 0x00, + 0x41, 0x1f, 0x21, 0x08, 0x20, 0x07, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, + 0x0d, 0x00, 0x20, 0x07, 0x41, 0x26, 0x20, 0x04, 0x41, 0x08, 0x76, 0x67, + 0x22, 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, + 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x08, 0x0b, 0x41, 0x00, 0x20, 0x07, 0x6b, + 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x08, + 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, + 0x00, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, + 0x09, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x20, 0x07, 0x41, 0x00, + 0x41, 0x19, 0x20, 0x08, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x08, 0x41, 0x1f, + 0x46, 0x1b, 0x74, 0x21, 0x00, 0x41, 0x00, 0x21, 0x09, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x07, 0x6b, + 0x22, 0x06, 0x20, 0x03, 0x4f, 0x0d, 0x00, 0x20, 0x06, 0x21, 0x03, 0x20, + 0x05, 0x21, 0x09, 0x20, 0x06, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x03, 0x20, + 0x05, 0x21, 0x09, 0x20, 0x05, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x04, + 0x20, 0x05, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x06, 0x20, 0x06, + 0x20, 0x05, 0x20, 0x00, 0x41, 0x1d, 0x76, 0x41, 0x04, 0x71, 0x6a, 0x41, + 0x10, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x05, 0x46, 0x1b, 0x20, 0x04, 0x20, + 0x06, 0x1b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x74, 0x21, 0x00, 0x20, + 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x04, 0x20, 0x09, 0x72, + 0x0d, 0x00, 0x41, 0x00, 0x21, 0x09, 0x41, 0x02, 0x20, 0x08, 0x74, 0x22, + 0x04, 0x41, 0x00, 0x20, 0x04, 0x6b, 0x72, 0x20, 0x0b, 0x71, 0x22, 0x04, + 0x45, 0x0d, 0x03, 0x20, 0x04, 0x68, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, + 0x80, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x04, + 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, + 0x78, 0x71, 0x20, 0x07, 0x6b, 0x22, 0x06, 0x20, 0x03, 0x49, 0x21, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x10, 0x22, 0x05, 0x0d, 0x00, 0x20, + 0x04, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x05, 0x0b, 0x20, 0x06, + 0x20, 0x03, 0x20, 0x00, 0x1b, 0x21, 0x03, 0x20, 0x04, 0x20, 0x09, 0x20, + 0x00, 0x1b, 0x21, 0x09, 0x20, 0x05, 0x21, 0x04, 0x20, 0x05, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x09, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x00, 0x28, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x6b, 0x4f, 0x0d, 0x00, + 0x20, 0x09, 0x28, 0x02, 0x18, 0x21, 0x02, 0x02, 0x40, 0x20, 0x09, 0x28, + 0x02, 0x0c, 0x22, 0x00, 0x20, 0x09, 0x46, 0x0d, 0x00, 0x20, 0x09, 0x28, + 0x02, 0x08, 0x22, 0x04, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa8, 0x80, 0x80, + 0x00, 0x49, 0x1a, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x09, + 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x04, 0x0d, 0x00, + 0x20, 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x04, 0x20, 0x09, + 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, 0x40, 0x20, 0x05, 0x21, 0x06, + 0x20, 0x04, 0x22, 0x00, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, 0x00, + 0x22, 0x04, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, + 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x41, + 0x00, 0x36, 0x02, 0x00, 0x0c, 0x0e, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, 0x20, 0x07, 0x49, 0x0d, + 0x00, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x03, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x07, 0x6b, 0x22, 0x05, 0x41, + 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x00, 0x20, + 0x05, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6a, + 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x07, 0x41, 0x03, 0x72, + 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x20, 0x04, 0x41, 0x03, + 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, + 0x21, 0x00, 0x41, 0x00, 0x21, 0x05, 0x0b, 0x41, 0x00, 0x20, 0x05, 0x36, + 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, + 0x98, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, 0x04, + 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x05, 0x20, 0x07, 0x4d, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x07, 0x6a, 0x22, 0x04, 0x20, 0x05, 0x20, 0x07, 0x6b, 0x22, 0x03, 0x41, + 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0x9c, + 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, 0x36, 0x02, 0x90, 0xa8, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, + 0x04, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x10, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xdc, 0xab, 0x80, 0x80, 0x00, + 0x45, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0xe4, 0xab, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x42, 0x7f, 0x37, 0x02, 0xe8, + 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x42, 0x80, 0x80, 0x84, 0x80, 0x80, + 0x80, 0xc0, 0x00, 0x37, 0x02, 0xe0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x41, 0x70, 0x71, 0x41, 0xd8, 0xaa, 0xd5, + 0xaa, 0x05, 0x73, 0x36, 0x02, 0xdc, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x36, 0x02, 0xf0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, + 0x00, 0x36, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x80, 0x80, 0x04, + 0x21, 0x03, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, 0x20, + 0x07, 0x41, 0xc7, 0x00, 0x6a, 0x22, 0x08, 0x6a, 0x22, 0x00, 0x41, 0x00, + 0x20, 0x03, 0x6b, 0x22, 0x06, 0x71, 0x22, 0x09, 0x20, 0x07, 0x4b, 0x0d, + 0x00, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, + 0x0c, 0x10, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xbc, 0xab, 0x80, + 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0xb4, 0xab, 0x80, 0x80, 0x00, 0x22, 0x03, 0x20, 0x09, 0x6a, 0x22, + 0x0b, 0x20, 0x03, 0x4d, 0x0d, 0x00, 0x20, 0x0b, 0x20, 0x04, 0x4d, 0x0d, + 0x01, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0x30, 0x36, 0x02, + 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x10, 0x0b, 0x41, 0x00, 0x2d, 0x00, + 0xc0, 0xab, 0x80, 0x80, 0x00, 0x41, 0x04, 0x71, 0x0d, 0x05, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x41, 0xc4, 0xab, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x28, + 0x02, 0x00, 0x22, 0x03, 0x20, 0x02, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x6a, 0x20, 0x02, 0x4b, 0x0d, 0x03, 0x0b, 0x20, + 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, + 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x41, 0x7f, 0x46, 0x0d, + 0x06, 0x20, 0x09, 0x21, 0x06, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0xe0, + 0xab, 0x80, 0x80, 0x00, 0x22, 0x04, 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x20, + 0x00, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x00, 0x6b, 0x20, 0x03, + 0x20, 0x00, 0x6a, 0x41, 0x00, 0x20, 0x04, 0x6b, 0x71, 0x6a, 0x21, 0x06, + 0x0b, 0x20, 0x06, 0x20, 0x07, 0x4d, 0x0d, 0x06, 0x20, 0x06, 0x41, 0xfe, + 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x06, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0xbc, 0xab, 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xb4, 0xab, 0x80, 0x80, 0x00, 0x22, 0x03, 0x20, 0x06, + 0x6a, 0x22, 0x05, 0x20, 0x03, 0x4d, 0x0d, 0x07, 0x20, 0x05, 0x20, 0x04, + 0x4b, 0x0d, 0x07, 0x0b, 0x20, 0x06, 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x04, 0x20, 0x00, 0x47, 0x0d, 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x00, + 0x20, 0x05, 0x6b, 0x20, 0x06, 0x71, 0x22, 0x06, 0x41, 0xfe, 0xff, 0xff, + 0xff, 0x07, 0x4b, 0x0d, 0x05, 0x20, 0x06, 0x10, 0xa1, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x00, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x04, 0x28, 0x02, + 0x04, 0x6a, 0x46, 0x0d, 0x04, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x02, 0x40, + 0x20, 0x06, 0x20, 0x07, 0x41, 0xc8, 0x00, 0x6a, 0x4f, 0x0d, 0x00, 0x20, + 0x04, 0x41, 0x7f, 0x46, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x08, 0x20, 0x06, + 0x6b, 0x41, 0x00, 0x28, 0x02, 0xe4, 0xab, 0x80, 0x80, 0x00, 0x22, 0x03, + 0x6a, 0x41, 0x00, 0x20, 0x03, 0x6b, 0x71, 0x22, 0x03, 0x41, 0xfe, 0xff, + 0xff, 0xff, 0x07, 0x4d, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x00, 0x0c, 0x08, + 0x0b, 0x02, 0x40, 0x20, 0x03, 0x10, 0xa1, 0x80, 0x80, 0x80, 0x00, 0x41, + 0x7f, 0x46, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x6a, 0x21, 0x06, 0x20, + 0x04, 0x21, 0x00, 0x0c, 0x08, 0x0b, 0x41, 0x00, 0x20, 0x06, 0x6b, 0x10, + 0xa1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0c, 0x05, 0x0b, 0x20, 0x04, 0x21, + 0x00, 0x20, 0x04, 0x41, 0x7f, 0x47, 0x0d, 0x06, 0x0c, 0x04, 0x0b, 0x00, + 0x00, 0x0b, 0x41, 0x00, 0x21, 0x09, 0x0c, 0x0c, 0x0b, 0x41, 0x00, 0x21, + 0x00, 0x0c, 0x0a, 0x0b, 0x20, 0x00, 0x41, 0x7f, 0x47, 0x0d, 0x02, 0x0b, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x41, + 0x04, 0x72, 0x36, 0x02, 0xc0, 0xab, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x09, + 0x41, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x01, 0x20, 0x09, 0x10, + 0xa1, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x41, 0x00, 0x10, 0xa1, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x04, 0x20, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, + 0x20, 0x04, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x04, 0x4f, + 0x0d, 0x01, 0x20, 0x04, 0x20, 0x00, 0x6b, 0x22, 0x06, 0x20, 0x07, 0x41, + 0x38, 0x6a, 0x4d, 0x0d, 0x01, 0x0b, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xb4, 0xab, 0x80, 0x80, 0x00, 0x20, 0x06, 0x6a, 0x22, 0x04, 0x36, 0x02, + 0xb4, 0xab, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x00, 0x28, + 0x02, 0xb8, 0xab, 0x80, 0x80, 0x00, 0x4d, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x04, 0x36, 0x02, 0xb8, 0xab, 0x80, 0x80, 0x00, 0x0b, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x41, 0xc4, 0xab, 0x80, 0x80, + 0x00, 0x21, 0x04, 0x03, 0x40, 0x20, 0x00, 0x20, 0x04, 0x28, 0x02, 0x00, + 0x22, 0x05, 0x20, 0x04, 0x28, 0x02, 0x04, 0x22, 0x09, 0x6a, 0x46, 0x0d, + 0x02, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, 0x0c, 0x03, + 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x94, 0xa8, + 0x80, 0x80, 0x00, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, + 0x4f, 0x0d, 0x01, 0x0b, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x94, 0xa8, + 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x20, 0x06, + 0x36, 0x02, 0xc8, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, + 0x02, 0xc4, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x7f, 0x36, 0x02, + 0xa4, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xdc, + 0xab, 0x80, 0x80, 0x00, 0x36, 0x02, 0xa8, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x36, 0x02, 0xd0, 0xab, 0x80, 0x80, 0x00, 0x03, 0x40, + 0x20, 0x04, 0x41, 0xc0, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, + 0xb4, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x03, 0x20, 0x04, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x05, + 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xb8, 0xa8, 0x80, 0x80, 0x00, 0x6a, + 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xc8, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x20, 0x04, 0x41, 0xbc, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, + 0x05, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x41, 0xd0, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x04, 0x41, 0xc4, + 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x20, 0x05, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0xcc, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, + 0x22, 0x04, 0x41, 0x80, 0x02, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, + 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x03, + 0x20, 0x06, 0x41, 0x48, 0x6a, 0x22, 0x05, 0x20, 0x04, 0x6b, 0x22, 0x04, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, + 0xec, 0xab, 0x80, 0x80, 0x00, 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x20, 0x04, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x03, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x20, 0x05, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x04, 0x0c, 0x02, 0x0b, 0x20, + 0x03, 0x20, 0x00, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x05, 0x49, 0x0d, + 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x41, 0x08, 0x71, 0x0d, 0x00, 0x20, + 0x03, 0x41, 0x78, 0x20, 0x03, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x05, 0x6a, + 0x22, 0x00, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x06, 0x6a, 0x22, 0x02, 0x20, 0x05, 0x6b, 0x22, 0x05, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x20, 0x04, 0x20, 0x09, 0x20, 0x06, 0x6a, 0x36, 0x02, + 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xec, 0xab, 0x80, 0x80, 0x00, + 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x05, 0x36, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, + 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x6a, 0x41, 0x38, + 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x00, + 0x28, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x09, 0x4f, 0x0d, 0x00, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x21, 0x09, 0x0b, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x05, 0x41, + 0xc4, 0xab, 0x80, 0x80, 0x00, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x03, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x05, + 0x46, 0x0d, 0x01, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x04, 0x0d, 0x00, + 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x04, 0x2d, 0x00, 0x0c, 0x41, 0x08, 0x71, + 0x45, 0x0d, 0x01, 0x0b, 0x41, 0xc4, 0xab, 0x80, 0x80, 0x00, 0x21, 0x04, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, 0x22, 0x05, 0x20, + 0x03, 0x4b, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x04, 0x28, 0x02, 0x04, 0x6a, + 0x22, 0x05, 0x20, 0x03, 0x4b, 0x0d, 0x03, 0x0b, 0x20, 0x04, 0x28, 0x02, + 0x08, 0x21, 0x04, 0x0c, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x20, 0x06, 0x6a, + 0x36, 0x02, 0x04, 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, + 0x71, 0x6a, 0x22, 0x02, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x05, 0x41, 0x78, 0x20, 0x05, 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x22, + 0x06, 0x20, 0x02, 0x20, 0x07, 0x6a, 0x22, 0x07, 0x6b, 0x21, 0x04, 0x02, + 0x40, 0x20, 0x06, 0x20, 0x03, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x07, + 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x36, + 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x0c, 0x08, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, + 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, + 0x00, 0x20, 0x07, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x28, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x04, 0x6a, + 0x22, 0x04, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, + 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, + 0x20, 0x04, 0x36, 0x02, 0x00, 0x0c, 0x08, 0x0b, 0x20, 0x06, 0x28, 0x02, + 0x04, 0x22, 0x03, 0x41, 0x03, 0x71, 0x41, 0x01, 0x47, 0x0d, 0x06, 0x20, + 0x03, 0x41, 0x78, 0x71, 0x21, 0x08, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x06, 0x28, 0x02, 0x08, 0x22, 0x05, 0x20, + 0x03, 0x41, 0x03, 0x76, 0x22, 0x09, 0x41, 0x03, 0x74, 0x41, 0xac, 0xa8, + 0x80, 0x80, 0x00, 0x6a, 0x22, 0x00, 0x46, 0x1a, 0x02, 0x40, 0x20, 0x06, + 0x28, 0x02, 0x0c, 0x22, 0x03, 0x20, 0x05, 0x47, 0x0d, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, + 0x09, 0x77, 0x71, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x07, + 0x0b, 0x20, 0x03, 0x20, 0x00, 0x46, 0x1a, 0x20, 0x03, 0x20, 0x05, 0x36, + 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x0c, 0x06, 0x0b, + 0x20, 0x06, 0x28, 0x02, 0x18, 0x21, 0x0b, 0x02, 0x40, 0x20, 0x06, 0x28, + 0x02, 0x0c, 0x22, 0x00, 0x20, 0x06, 0x46, 0x0d, 0x00, 0x20, 0x06, 0x28, + 0x02, 0x08, 0x22, 0x03, 0x20, 0x09, 0x49, 0x1a, 0x20, 0x00, 0x20, 0x03, + 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x05, + 0x0b, 0x02, 0x40, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x22, 0x05, 0x28, 0x02, + 0x00, 0x22, 0x03, 0x0d, 0x00, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, + 0x45, 0x0d, 0x04, 0x20, 0x06, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x0b, 0x03, + 0x40, 0x20, 0x05, 0x21, 0x09, 0x20, 0x03, 0x22, 0x00, 0x41, 0x14, 0x6a, + 0x22, 0x05, 0x28, 0x02, 0x00, 0x22, 0x03, 0x0d, 0x00, 0x20, 0x00, 0x41, + 0x10, 0x6a, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x03, 0x0d, + 0x00, 0x0b, 0x20, 0x09, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x04, 0x0b, + 0x20, 0x00, 0x41, 0x78, 0x20, 0x00, 0x6b, 0x41, 0x0f, 0x71, 0x22, 0x04, + 0x6a, 0x22, 0x02, 0x20, 0x06, 0x41, 0x48, 0x6a, 0x22, 0x09, 0x20, 0x04, + 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, + 0x09, 0x6a, 0x41, 0x38, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x05, 0x41, + 0x37, 0x20, 0x05, 0x6b, 0x41, 0x0f, 0x71, 0x6a, 0x41, 0x41, 0x6a, 0x22, + 0x09, 0x20, 0x09, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x49, 0x1b, 0x22, 0x09, + 0x41, 0x23, 0x36, 0x02, 0x04, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0xec, + 0xab, 0x80, 0x80, 0x00, 0x36, 0x02, 0xa0, 0xa8, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x20, 0x04, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x20, 0x02, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, + 0x10, 0x6a, 0x41, 0x00, 0x29, 0x02, 0xcc, 0xab, 0x80, 0x80, 0x00, 0x37, + 0x02, 0x00, 0x20, 0x09, 0x41, 0x00, 0x29, 0x02, 0xc4, 0xab, 0x80, 0x80, + 0x00, 0x37, 0x02, 0x08, 0x41, 0x00, 0x20, 0x09, 0x41, 0x08, 0x6a, 0x36, + 0x02, 0xcc, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x06, 0x36, 0x02, + 0xc8, 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0xc4, + 0xab, 0x80, 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x02, 0xd0, 0xab, + 0x80, 0x80, 0x00, 0x20, 0x09, 0x41, 0x24, 0x6a, 0x21, 0x04, 0x03, 0x40, + 0x20, 0x04, 0x41, 0x07, 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, + 0x22, 0x04, 0x20, 0x05, 0x49, 0x0d, 0x00, 0x0b, 0x20, 0x09, 0x20, 0x03, + 0x46, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x09, 0x28, 0x02, 0x04, 0x41, 0x7e, + 0x71, 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, 0x09, 0x20, 0x03, 0x6b, 0x22, + 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, + 0x02, 0x04, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, + 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, + 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, 0x01, 0x20, 0x00, 0x41, 0x03, 0x76, + 0x74, 0x22, 0x00, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, 0x00, + 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x04, 0x21, 0x05, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x05, 0x0b, 0x20, + 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, + 0x08, 0x20, 0x03, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x05, + 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, 0x04, 0x02, 0x40, + 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, 0x76, 0x67, 0x22, 0x04, 0x6b, 0x76, + 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, + 0x21, 0x04, 0x0b, 0x20, 0x03, 0x20, 0x04, 0x36, 0x02, 0x1c, 0x20, 0x03, + 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x04, 0x41, 0x02, 0x74, 0x41, 0xb4, + 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x09, 0x41, 0x01, 0x20, 0x04, + 0x74, 0x22, 0x06, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x41, 0x00, 0x20, 0x09, 0x20, 0x06, 0x72, 0x36, 0x02, 0x88, 0xa8, + 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x03, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x0c, + 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, + 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, 0x09, 0x02, 0x40, 0x03, 0x40, 0x20, + 0x09, 0x22, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x00, 0x46, + 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, 0x76, 0x21, 0x09, 0x20, 0x04, 0x41, + 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, 0x20, 0x09, 0x41, 0x04, 0x71, 0x6a, + 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, 0x02, 0x00, 0x22, 0x09, 0x0d, 0x00, + 0x0b, 0x20, 0x06, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x05, + 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x03, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x08, 0x22, 0x04, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x03, + 0x36, 0x02, 0x08, 0x20, 0x03, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x03, + 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x0b, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, + 0x20, 0x07, 0x4d, 0x0d, 0x00, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x03, 0x20, 0x07, 0x6a, 0x22, 0x05, 0x20, 0x04, 0x20, + 0x07, 0x6b, 0x22, 0x04, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x41, 0x00, + 0x20, 0x04, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, + 0x05, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x07, + 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x21, + 0x04, 0x0c, 0x08, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x41, 0x00, 0x41, 0x30, + 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x07, 0x0b, 0x41, 0x00, + 0x21, 0x00, 0x0b, 0x20, 0x0b, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x06, 0x20, 0x06, 0x28, 0x02, 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, + 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x03, 0x28, 0x02, 0x00, + 0x47, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x0d, 0x01, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, + 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, + 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x0b, 0x41, 0x10, 0x41, 0x14, 0x20, + 0x0b, 0x28, 0x02, 0x10, 0x20, 0x06, 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x0b, + 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x03, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x03, + 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x18, + 0x0b, 0x20, 0x08, 0x20, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x06, 0x20, 0x08, + 0x6a, 0x22, 0x06, 0x28, 0x02, 0x04, 0x21, 0x03, 0x0b, 0x20, 0x06, 0x20, + 0x03, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x20, 0x07, 0x20, 0x04, 0x6a, + 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, 0x07, 0x20, 0x04, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x02, 0x40, 0x20, 0x04, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x20, 0x04, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, + 0x6a, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, + 0xa8, 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, 0x01, 0x20, 0x04, 0x41, 0x03, + 0x76, 0x74, 0x22, 0x04, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x05, 0x20, + 0x04, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, 0x21, + 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x08, 0x21, 0x04, 0x0b, + 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x07, 0x36, + 0x02, 0x08, 0x20, 0x07, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, + 0x04, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, 0x03, 0x02, + 0x40, 0x20, 0x04, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, + 0x04, 0x41, 0x26, 0x20, 0x04, 0x41, 0x08, 0x76, 0x67, 0x22, 0x03, 0x6b, + 0x76, 0x41, 0x01, 0x71, 0x20, 0x03, 0x41, 0x01, 0x74, 0x6b, 0x41, 0x3e, + 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x07, 0x20, 0x03, 0x36, 0x02, 0x1c, 0x20, + 0x07, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x03, 0x41, 0x02, 0x74, 0x41, + 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x41, 0x00, + 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x00, 0x41, 0x01, 0x20, + 0x03, 0x74, 0x22, 0x09, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x07, 0x36, + 0x02, 0x00, 0x41, 0x00, 0x20, 0x00, 0x20, 0x09, 0x72, 0x36, 0x02, 0x88, + 0xa8, 0x80, 0x80, 0x00, 0x20, 0x07, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, + 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, + 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x41, 0x00, 0x41, 0x19, 0x20, 0x03, + 0x41, 0x01, 0x76, 0x6b, 0x20, 0x03, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, + 0x03, 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, 0x00, 0x02, 0x40, 0x03, 0x40, + 0x20, 0x00, 0x22, 0x05, 0x28, 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x04, + 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x1d, 0x76, 0x21, 0x00, 0x20, 0x03, + 0x41, 0x01, 0x74, 0x21, 0x03, 0x20, 0x05, 0x20, 0x00, 0x41, 0x04, 0x71, + 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x09, 0x28, 0x02, 0x00, 0x22, 0x00, 0x0d, + 0x00, 0x0b, 0x20, 0x09, 0x20, 0x07, 0x36, 0x02, 0x00, 0x20, 0x07, 0x20, + 0x05, 0x36, 0x02, 0x18, 0x20, 0x07, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, + 0x07, 0x20, 0x07, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x08, 0x22, 0x04, 0x20, 0x07, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, + 0x07, 0x36, 0x02, 0x08, 0x20, 0x07, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, + 0x07, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, 0x07, 0x20, 0x04, 0x36, 0x02, + 0x08, 0x0b, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0c, 0x02, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x09, 0x20, 0x09, 0x28, 0x02, 0x1c, 0x22, 0x05, 0x41, 0x02, 0x74, 0x41, + 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x47, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0d, + 0x01, 0x41, 0x00, 0x20, 0x0b, 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x22, + 0x0b, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, + 0x02, 0x41, 0x10, 0x41, 0x14, 0x20, 0x02, 0x28, 0x02, 0x10, 0x20, 0x09, + 0x46, 0x1b, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x45, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x02, 0x36, 0x02, 0x18, 0x02, 0x40, 0x20, + 0x09, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x04, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, + 0x20, 0x09, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x04, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x20, 0x04, 0x36, 0x02, 0x00, 0x20, + 0x04, 0x20, 0x00, 0x36, 0x02, 0x18, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x03, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x20, 0x09, 0x20, 0x03, 0x20, 0x07, + 0x6a, 0x22, 0x04, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, + 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x09, 0x20, 0x07, 0x6a, 0x22, + 0x00, 0x20, 0x03, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x09, 0x20, + 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x00, 0x20, 0x03, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, + 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, + 0x80, 0x00, 0x6a, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x05, 0x41, 0x01, 0x20, 0x03, + 0x41, 0x03, 0x76, 0x74, 0x22, 0x03, 0x71, 0x0d, 0x00, 0x41, 0x00, 0x20, + 0x05, 0x20, 0x03, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x04, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, + 0x03, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, + 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, + 0x00, 0x20, 0x03, 0x36, 0x02, 0x08, 0x0c, 0x01, 0x0b, 0x41, 0x1f, 0x21, + 0x04, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0xff, 0xff, 0x07, 0x4b, 0x0d, + 0x00, 0x20, 0x03, 0x41, 0x26, 0x20, 0x03, 0x41, 0x08, 0x76, 0x67, 0x22, + 0x04, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x04, 0x41, 0x01, 0x74, 0x6b, + 0x41, 0x3e, 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x00, 0x20, 0x04, 0x36, 0x02, + 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, 0x04, 0x41, 0x02, + 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x05, 0x02, 0x40, + 0x20, 0x0b, 0x41, 0x01, 0x20, 0x04, 0x74, 0x22, 0x07, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, 0x0b, 0x20, + 0x07, 0x72, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, + 0x05, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, + 0x00, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x00, 0x41, 0x19, 0x20, 0x04, 0x41, 0x01, 0x76, 0x6b, 0x20, 0x04, 0x41, + 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x21, + 0x07, 0x02, 0x40, 0x03, 0x40, 0x20, 0x07, 0x22, 0x05, 0x28, 0x02, 0x04, + 0x41, 0x78, 0x71, 0x20, 0x03, 0x46, 0x0d, 0x01, 0x20, 0x04, 0x41, 0x1d, + 0x76, 0x21, 0x07, 0x20, 0x04, 0x41, 0x01, 0x74, 0x21, 0x04, 0x20, 0x05, + 0x20, 0x07, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, 0x06, 0x28, + 0x02, 0x00, 0x22, 0x07, 0x0d, 0x00, 0x0b, 0x20, 0x06, 0x20, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, + 0x00, 0x36, 0x02, 0x0c, 0x20, 0x00, 0x20, 0x00, 0x36, 0x02, 0x08, 0x0c, + 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x00, 0x36, + 0x02, 0x0c, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x08, 0x20, 0x00, 0x41, + 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x0c, 0x20, + 0x00, 0x20, 0x04, 0x36, 0x02, 0x08, 0x0b, 0x20, 0x09, 0x41, 0x08, 0x6a, + 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x0b, 0x45, 0x0d, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x1c, 0x22, + 0x05, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x22, + 0x04, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x09, 0x36, + 0x02, 0x00, 0x20, 0x09, 0x0d, 0x01, 0x41, 0x00, 0x20, 0x0a, 0x41, 0x7e, + 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, + 0x02, 0x0b, 0x20, 0x0b, 0x41, 0x10, 0x41, 0x14, 0x20, 0x0b, 0x28, 0x02, + 0x10, 0x20, 0x00, 0x46, 0x1b, 0x6a, 0x20, 0x09, 0x36, 0x02, 0x00, 0x20, + 0x09, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x09, 0x20, 0x0b, 0x36, 0x02, 0x18, + 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10, 0x22, 0x04, 0x45, 0x0d, 0x00, + 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, 0x09, 0x36, + 0x02, 0x18, 0x0b, 0x20, 0x00, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x04, 0x45, 0x0d, 0x00, 0x20, 0x09, 0x41, 0x14, 0x6a, 0x20, 0x04, 0x36, + 0x02, 0x00, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x18, 0x0b, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, + 0x03, 0x20, 0x07, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x00, 0x20, 0x04, 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x04, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, + 0x07, 0x6a, 0x22, 0x05, 0x20, 0x03, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, + 0x20, 0x00, 0x20, 0x07, 0x41, 0x03, 0x72, 0x36, 0x02, 0x04, 0x20, 0x05, + 0x20, 0x03, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x02, 0x40, 0x20, 0x08, + 0x45, 0x0d, 0x00, 0x20, 0x08, 0x41, 0x78, 0x71, 0x41, 0xac, 0xa8, 0x80, + 0x80, 0x00, 0x6a, 0x21, 0x07, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x01, 0x20, 0x08, + 0x41, 0x03, 0x76, 0x74, 0x22, 0x09, 0x20, 0x06, 0x71, 0x0d, 0x00, 0x41, + 0x00, 0x20, 0x09, 0x20, 0x06, 0x72, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, + 0x00, 0x20, 0x07, 0x21, 0x09, 0x0c, 0x01, 0x0b, 0x20, 0x07, 0x28, 0x02, + 0x08, 0x21, 0x09, 0x0b, 0x20, 0x09, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, + 0x07, 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x07, 0x36, 0x02, + 0x0c, 0x20, 0x04, 0x20, 0x09, 0x36, 0x02, 0x08, 0x0b, 0x41, 0x00, 0x20, + 0x05, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x03, + 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x08, + 0x6a, 0x21, 0x04, 0x0b, 0x20, 0x01, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x04, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x92, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0xb0, 0x0d, 0x01, 0x07, 0x7f, 0x02, 0x40, + 0x20, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x6a, 0x22, 0x01, + 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x78, + 0x71, 0x22, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x41, 0x01, + 0x71, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, + 0x01, 0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, + 0x00, 0x28, 0x02, 0x94, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, 0x49, 0x0d, + 0x01, 0x20, 0x02, 0x20, 0x00, 0x6a, 0x21, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, + 0x00, 0x46, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff, 0x01, 0x4b, + 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, 0x08, 0x22, 0x04, 0x20, 0x02, 0x41, + 0x03, 0x76, 0x22, 0x05, 0x41, 0x03, 0x74, 0x41, 0xac, 0xa8, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x06, 0x46, 0x1a, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, + 0x0c, 0x22, 0x02, 0x20, 0x04, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x00, + 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x05, 0x77, + 0x71, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x05, 0x0b, 0x20, + 0x02, 0x20, 0x06, 0x46, 0x1a, 0x20, 0x02, 0x20, 0x04, 0x36, 0x02, 0x08, + 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x0c, 0x04, 0x0b, 0x20, 0x01, + 0x28, 0x02, 0x18, 0x21, 0x07, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x0c, + 0x22, 0x06, 0x20, 0x01, 0x46, 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, 0x08, + 0x22, 0x02, 0x20, 0x04, 0x49, 0x1a, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, + 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x0d, 0x00, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, + 0x02, 0x20, 0x01, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, + 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, + 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, + 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, + 0x28, 0x02, 0x04, 0x22, 0x02, 0x41, 0x03, 0x71, 0x41, 0x03, 0x47, 0x0d, + 0x02, 0x20, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x41, + 0x00, 0x20, 0x00, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, + 0x36, 0x02, 0x04, 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x0b, 0x20, 0x07, + 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x20, 0x01, 0x28, + 0x02, 0x1c, 0x22, 0x04, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, + 0x00, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x02, + 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x0d, 0x01, 0x41, 0x00, 0x41, + 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, 0x20, 0x04, + 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, + 0x20, 0x07, 0x41, 0x10, 0x41, 0x14, 0x20, 0x07, 0x28, 0x02, 0x10, 0x20, + 0x01, 0x46, 0x1b, 0x6a, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x45, + 0x0d, 0x01, 0x0b, 0x20, 0x06, 0x20, 0x07, 0x36, 0x02, 0x18, 0x02, 0x40, + 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, + 0x20, 0x02, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, + 0x0b, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x02, 0x45, + 0x0d, 0x00, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x20, 0x02, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, 0x20, 0x03, + 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x04, 0x22, 0x02, 0x41, 0x01, + 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x03, 0x41, 0x00, 0x28, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x01, 0x36, 0x02, 0x9c, 0xa8, 0x80, 0x80, 0x00, + 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x00, 0x6a, 0x22, 0x00, 0x36, 0x02, 0x90, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, + 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x06, 0x41, + 0x00, 0x41, 0x00, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x00, + 0x41, 0x00, 0x36, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x00, 0x28, 0x02, 0x98, 0xa8, 0x80, 0x80, 0x00, + 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x01, 0x36, 0x02, 0x98, 0xa8, 0x80, + 0x80, 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x8c, 0xa8, 0x80, 0x80, + 0x00, 0x20, 0x00, 0x6a, 0x22, 0x00, 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, + 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, + 0x01, 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x0f, 0x0b, 0x20, + 0x02, 0x41, 0x78, 0x71, 0x20, 0x00, 0x6a, 0x21, 0x00, 0x02, 0x40, 0x20, + 0x02, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x08, + 0x22, 0x04, 0x20, 0x02, 0x41, 0x03, 0x76, 0x22, 0x05, 0x41, 0x03, 0x74, + 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x22, 0x06, 0x46, 0x1a, 0x02, + 0x40, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x22, 0x02, 0x20, 0x04, 0x47, 0x0d, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, + 0x41, 0x7e, 0x20, 0x05, 0x77, 0x71, 0x36, 0x02, 0x84, 0xa8, 0x80, 0x80, + 0x00, 0x0c, 0x05, 0x0b, 0x20, 0x02, 0x20, 0x06, 0x46, 0x1a, 0x20, 0x02, + 0x20, 0x04, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, + 0x0c, 0x04, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x18, 0x21, 0x07, 0x02, 0x40, + 0x20, 0x03, 0x28, 0x02, 0x0c, 0x22, 0x06, 0x20, 0x03, 0x46, 0x0d, 0x00, + 0x20, 0x03, 0x28, 0x02, 0x08, 0x22, 0x02, 0x41, 0x00, 0x28, 0x02, 0x94, + 0xa8, 0x80, 0x80, 0x00, 0x49, 0x1a, 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, + 0x08, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x0c, 0x0c, 0x03, 0x0b, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x14, 0x6a, 0x22, 0x04, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x0d, 0x00, 0x20, 0x03, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, + 0x02, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x0b, 0x03, 0x40, 0x20, + 0x04, 0x21, 0x05, 0x20, 0x02, 0x22, 0x06, 0x41, 0x14, 0x6a, 0x22, 0x04, + 0x28, 0x02, 0x00, 0x22, 0x02, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x10, 0x6a, + 0x21, 0x04, 0x20, 0x06, 0x28, 0x02, 0x10, 0x22, 0x02, 0x0d, 0x00, 0x0b, + 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x03, + 0x20, 0x02, 0x41, 0x7e, 0x71, 0x36, 0x02, 0x04, 0x20, 0x01, 0x20, 0x00, + 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, 0x41, 0x01, + 0x72, 0x36, 0x02, 0x04, 0x0c, 0x03, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x0b, + 0x20, 0x07, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x20, + 0x03, 0x28, 0x02, 0x1c, 0x22, 0x04, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, + 0x80, 0x80, 0x00, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x47, 0x0d, 0x00, + 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, 0x06, 0x0d, 0x01, 0x41, + 0x00, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7e, + 0x20, 0x04, 0x77, 0x71, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x0c, + 0x02, 0x0b, 0x20, 0x07, 0x41, 0x10, 0x41, 0x14, 0x20, 0x07, 0x28, 0x02, + 0x10, 0x20, 0x03, 0x46, 0x1b, 0x6a, 0x20, 0x06, 0x36, 0x02, 0x00, 0x20, + 0x06, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x06, 0x20, 0x07, 0x36, 0x02, 0x18, + 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x10, 0x22, 0x02, 0x45, 0x0d, 0x00, + 0x20, 0x06, 0x20, 0x02, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x06, 0x36, + 0x02, 0x18, 0x0b, 0x20, 0x03, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x45, 0x0d, 0x00, 0x20, 0x06, 0x41, 0x14, 0x6a, 0x20, 0x02, 0x36, + 0x02, 0x00, 0x20, 0x02, 0x20, 0x06, 0x36, 0x02, 0x18, 0x0b, 0x20, 0x01, + 0x20, 0x00, 0x6a, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x00, + 0x41, 0x01, 0x72, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x00, 0x28, 0x02, + 0x98, 0xa8, 0x80, 0x80, 0x00, 0x47, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x00, + 0x36, 0x02, 0x8c, 0xa8, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, + 0x00, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x78, 0x71, + 0x41, 0xac, 0xa8, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x02, 0x02, 0x40, 0x02, + 0x40, 0x41, 0x00, 0x28, 0x02, 0x84, 0xa8, 0x80, 0x80, 0x00, 0x22, 0x04, + 0x41, 0x01, 0x20, 0x00, 0x41, 0x03, 0x76, 0x74, 0x22, 0x00, 0x71, 0x0d, + 0x00, 0x41, 0x00, 0x20, 0x04, 0x20, 0x00, 0x72, 0x36, 0x02, 0x84, 0xa8, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x02, + 0x28, 0x02, 0x08, 0x21, 0x00, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, + 0x0c, 0x20, 0x02, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x01, 0x20, 0x02, + 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x08, 0x0f, 0x0b, + 0x41, 0x1f, 0x21, 0x02, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0xff, + 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x26, 0x20, 0x00, 0x41, 0x08, + 0x76, 0x67, 0x22, 0x02, 0x6b, 0x76, 0x41, 0x01, 0x71, 0x20, 0x02, 0x41, + 0x01, 0x74, 0x6b, 0x41, 0x3e, 0x6a, 0x21, 0x02, 0x0b, 0x20, 0x01, 0x20, + 0x02, 0x36, 0x02, 0x1c, 0x20, 0x01, 0x42, 0x00, 0x37, 0x02, 0x10, 0x20, + 0x02, 0x41, 0x02, 0x74, 0x41, 0xb4, 0xaa, 0x80, 0x80, 0x00, 0x6a, 0x21, + 0x04, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x88, 0xa8, 0x80, + 0x80, 0x00, 0x22, 0x06, 0x41, 0x01, 0x20, 0x02, 0x74, 0x22, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x00, 0x41, 0x00, 0x20, + 0x06, 0x20, 0x03, 0x72, 0x36, 0x02, 0x88, 0xa8, 0x80, 0x80, 0x00, 0x20, + 0x01, 0x20, 0x04, 0x36, 0x02, 0x18, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, + 0x08, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x19, 0x20, 0x02, 0x41, 0x01, 0x76, 0x6b, 0x20, + 0x02, 0x41, 0x1f, 0x46, 0x1b, 0x74, 0x21, 0x02, 0x20, 0x04, 0x28, 0x02, + 0x00, 0x21, 0x06, 0x02, 0x40, 0x03, 0x40, 0x20, 0x06, 0x22, 0x04, 0x28, + 0x02, 0x04, 0x41, 0x78, 0x71, 0x20, 0x00, 0x46, 0x0d, 0x01, 0x20, 0x02, + 0x41, 0x1d, 0x76, 0x21, 0x06, 0x20, 0x02, 0x41, 0x01, 0x74, 0x21, 0x02, + 0x20, 0x04, 0x20, 0x06, 0x41, 0x04, 0x71, 0x6a, 0x41, 0x10, 0x6a, 0x22, + 0x03, 0x28, 0x02, 0x00, 0x22, 0x06, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, + 0x01, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, 0x18, 0x20, + 0x01, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x20, 0x01, 0x20, 0x01, 0x36, 0x02, + 0x08, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x22, 0x00, 0x20, + 0x01, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, + 0x01, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x01, 0x20, 0x04, 0x36, 0x02, + 0x0c, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x08, 0x0b, 0x41, 0x00, 0x41, + 0x00, 0x28, 0x02, 0xa4, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x6a, 0x22, + 0x01, 0x41, 0x7f, 0x20, 0x01, 0x1b, 0x36, 0x02, 0xa4, 0xa8, 0x80, 0x80, + 0x00, 0x0b, 0x0b, 0x6b, 0x02, 0x01, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, + 0x20, 0x00, 0xad, 0x20, 0x01, 0xad, 0x7e, 0x22, 0x03, 0xa7, 0x21, 0x02, + 0x20, 0x01, 0x20, 0x00, 0x72, 0x41, 0x80, 0x80, 0x04, 0x49, 0x0d, 0x00, + 0x41, 0x7f, 0x20, 0x02, 0x20, 0x03, 0x42, 0x20, 0x88, 0xa7, 0x41, 0x00, + 0x47, 0x1b, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x10, 0x90, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, + 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x00, 0x20, 0x02, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x00, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x9e, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x99, 0x80, + 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, + 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, + 0x8f, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, + 0x41, 0x04, 0x10, 0x93, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, 0x0d, + 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x98, 0x80, 0x80, 0x80, 0x00, 0x0d, + 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x8e, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, 0x94, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x94, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x94, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xc6, 0x00, 0x10, 0x94, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, + 0x02, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x91, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, 0x10, 0x94, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x27, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, + 0x00, 0x02, 0x40, 0x20, 0x00, 0x10, 0x9a, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x00, 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x20, 0x00, 0x36, + 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x0b, 0x11, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, + 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x0f, 0x00, 0x20, + 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, + 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x83, 0x80, 0x80, 0x80, + 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x15, 0x00, 0x20, 0x00, 0x20, + 0x01, 0x20, 0x02, 0x20, 0x03, 0x10, 0x84, 0x80, 0x80, 0x80, 0x00, 0x41, + 0xff, 0xff, 0x03, 0x71, 0x0b, 0x15, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, + 0x02, 0x20, 0x03, 0x10, 0x85, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, + 0x03, 0x71, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x86, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x19, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, + 0x03, 0x20, 0x04, 0x20, 0x05, 0x10, 0x87, 0x80, 0x80, 0x80, 0x00, 0x41, + 0xff, 0xff, 0x03, 0x71, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x0b, 0x4e, 0x00, + 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x0f, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x7f, 0x4c, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, + 0x10, 0x76, 0x40, 0x00, 0x22, 0x00, 0x41, 0x7f, 0x47, 0x0d, 0x00, 0x41, + 0x00, 0x41, 0x30, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, + 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x10, 0x74, 0x0f, 0x0b, 0x10, 0xa0, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0xa2, + 0x80, 0x80, 0x80, 0x00, 0x10, 0xaf, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x23, + 0x00, 0x20, 0x00, 0x41, 0x18, 0x74, 0x20, 0x00, 0x41, 0x80, 0xfe, 0x03, + 0x71, 0x41, 0x08, 0x74, 0x72, 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, + 0xfe, 0x03, 0x71, 0x20, 0x00, 0x41, 0x18, 0x76, 0x72, 0x72, 0x0b, 0x12, + 0x00, 0x20, 0x00, 0x41, 0x08, 0x74, 0x20, 0x00, 0x41, 0x08, 0x76, 0x72, + 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x3b, 0x01, 0x01, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x20, 0x01, 0x36, 0x02, 0x0c, 0x41, 0x80, + 0x9e, 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xba, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x01, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x01, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, + 0x38, 0x10, 0x97, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x71, 0x01, 0x02, 0x7f, + 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x04, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x41, 0x1c, + 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, + 0x9d, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, + 0x20, 0x02, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, + 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x21, 0x04, 0x0b, + 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x04, 0x0b, 0xbb, 0x02, 0x01, 0x07, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x03, 0x20, 0x01, 0x36, + 0x02, 0x08, 0x20, 0x03, 0x20, 0x00, 0x28, 0x02, 0x18, 0x22, 0x01, 0x36, + 0x02, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x01, 0x6b, + 0x22, 0x04, 0x36, 0x02, 0x04, 0x41, 0x02, 0x21, 0x05, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x28, 0x02, 0x38, 0x20, 0x03, 0x41, 0x02, 0x10, 0xa8, + 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x22, + 0x06, 0x46, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x01, 0x41, 0x7f, 0x4a, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, + 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, + 0x10, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, + 0x02, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x03, 0x20, 0x02, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x6b, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x04, + 0x20, 0x01, 0x20, 0x04, 0x28, 0x02, 0x04, 0x22, 0x07, 0x4b, 0x22, 0x08, + 0x41, 0x03, 0x74, 0x6a, 0x22, 0x09, 0x20, 0x09, 0x28, 0x02, 0x00, 0x20, + 0x01, 0x20, 0x07, 0x41, 0x00, 0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x6a, + 0x36, 0x02, 0x00, 0x20, 0x04, 0x41, 0x0c, 0x41, 0x04, 0x20, 0x08, 0x1b, + 0x6a, 0x22, 0x04, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x07, 0x6b, 0x36, + 0x02, 0x00, 0x20, 0x09, 0x21, 0x04, 0x20, 0x06, 0x20, 0x01, 0x6b, 0x22, + 0x06, 0x20, 0x00, 0x28, 0x02, 0x38, 0x20, 0x09, 0x20, 0x05, 0x20, 0x08, + 0x6b, 0x22, 0x05, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x47, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, + 0x01, 0x36, 0x02, 0x18, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, + 0x20, 0x02, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0b, 0x66, 0x01, 0x02, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x20, 0x6b, 0x22, 0x01, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x41, 0x08, 0x6a, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x0d, + 0x00, 0x41, 0x3b, 0x21, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x08, 0x41, 0x02, + 0x47, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x10, 0x41, 0x24, 0x71, 0x0d, + 0x00, 0x41, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x02, + 0x41, 0x00, 0x20, 0x00, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0b, + 0x20, 0x01, 0x41, 0x20, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x02, 0x0b, 0x3b, 0x00, 0x20, 0x00, 0x41, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x36, 0x02, 0x20, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0xc0, + 0x00, 0x71, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x38, 0x10, 0xaa, 0x80, + 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7f, 0x36, 0x02, 0x40, + 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xa9, 0x80, 0x80, 0x80, + 0x00, 0x0b, 0x64, 0x01, 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0xff, 0x01, + 0x71, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x10, 0x9c, 0x80, 0x80, 0x80, 0x00, + 0x22, 0x02, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x41, 0xc6, 0x00, 0x20, 0x02, + 0x20, 0x02, 0x41, 0xcc, 0x00, 0x46, 0x1b, 0x36, 0x02, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x42, 0x7f, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x29, + 0x03, 0x08, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x38, 0x20, 0x01, 0x20, 0x02, 0x10, 0xac, 0x80, 0x80, 0x80, 0x00, + 0x0b, 0x08, 0x00, 0x41, 0x88, 0xb4, 0x80, 0x80, 0x00, 0x0b, 0x83, 0x03, + 0x01, 0x03, 0x7f, 0x02, 0x40, 0x10, 0xae, 0x80, 0x80, 0x80, 0x00, 0x28, + 0x02, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, + 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, + 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, + 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x34, 0x22, 0x00, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, 0x8c, 0xb4, 0x80, 0x80, + 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, + 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, + 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x41, 0x00, 0x28, 0x02, 0xf0, 0x9e, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, + 0x02, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, + 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, + 0x0b, 0x20, 0x00, 0x28, 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, + 0x08, 0x22, 0x02, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, + 0x6b, 0xac, 0x41, 0x01, 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x41, 0x00, 0x28, 0x02, + 0xe8, 0x9f, 0x80, 0x80, 0x00, 0x22, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x00, 0x28, 0x02, 0x14, 0x20, 0x00, 0x28, 0x02, 0x18, 0x46, 0x0d, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, + 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x0b, 0x20, 0x00, 0x28, + 0x02, 0x04, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x08, 0x22, 0x02, 0x46, + 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x6b, 0xac, 0x41, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x1a, 0x0b, 0x0b, 0x5c, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00, 0x28, + 0x02, 0x3c, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x36, 0x02, + 0x3c, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, + 0x02, 0x00, 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, + 0x04, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x28, 0x22, 0x01, 0x36, 0x02, + 0x18, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x00, 0x28, 0x02, 0x2c, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, + 0xe8, 0x01, 0x01, 0x05, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x28, + 0x02, 0x10, 0x22, 0x03, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x04, 0x20, 0x02, + 0x10, 0xb0, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x02, 0x28, 0x02, + 0x10, 0x21, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x20, 0x02, 0x28, 0x02, + 0x14, 0x22, 0x05, 0x6b, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0f, 0x0b, 0x41, 0x00, 0x21, 0x06, 0x02, 0x40, 0x20, + 0x02, 0x28, 0x02, 0x40, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x06, 0x20, 0x00, 0x21, 0x04, 0x41, 0x00, 0x21, 0x03, 0x03, 0x40, 0x20, + 0x01, 0x20, 0x03, 0x46, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, + 0x03, 0x20, 0x04, 0x41, 0x7f, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x6a, 0x22, + 0x07, 0x2d, 0x00, 0x00, 0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x02, + 0x20, 0x00, 0x20, 0x01, 0x20, 0x03, 0x6b, 0x41, 0x01, 0x6a, 0x22, 0x06, + 0x20, 0x02, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x22, 0x04, 0x20, 0x06, 0x49, 0x0d, 0x01, 0x20, 0x03, 0x41, 0x7f, 0x6a, + 0x21, 0x01, 0x20, 0x07, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x28, + 0x02, 0x14, 0x21, 0x05, 0x0b, 0x20, 0x05, 0x20, 0x00, 0x20, 0x01, 0x10, + 0xbf, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x14, 0x20, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x06, 0x20, 0x01, 0x6a, + 0x21, 0x04, 0x0b, 0x20, 0x04, 0x0b, 0x95, 0x02, 0x01, 0x06, 0x7f, 0x20, + 0x02, 0x20, 0x01, 0x6c, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, + 0x28, 0x02, 0x10, 0x22, 0x05, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x06, 0x20, + 0x03, 0x10, 0xb0, 0x80, 0x80, 0x80, 0x00, 0x0d, 0x01, 0x20, 0x03, 0x28, + 0x02, 0x10, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x20, 0x03, 0x28, + 0x02, 0x14, 0x22, 0x07, 0x6b, 0x20, 0x04, 0x4f, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x21, 0x06, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, + 0x08, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x28, 0x02, 0x40, 0x41, 0x00, + 0x4e, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x00, + 0x20, 0x04, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x21, 0x08, 0x41, 0x00, 0x21, + 0x05, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x20, 0x05, 0x6a, 0x0d, 0x00, + 0x20, 0x04, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, 0x7f, 0x6a, + 0x22, 0x05, 0x20, 0x06, 0x6a, 0x22, 0x09, 0x2d, 0x00, 0x00, 0x41, 0x0a, + 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x20, 0x04, 0x20, 0x05, + 0x6a, 0x41, 0x01, 0x6a, 0x22, 0x08, 0x20, 0x03, 0x28, 0x02, 0x20, 0x11, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x22, 0x06, 0x20, 0x08, 0x49, 0x0d, + 0x01, 0x20, 0x05, 0x41, 0x7f, 0x73, 0x21, 0x05, 0x20, 0x09, 0x41, 0x01, + 0x6a, 0x21, 0x00, 0x20, 0x03, 0x28, 0x02, 0x14, 0x21, 0x07, 0x0b, 0x20, + 0x07, 0x20, 0x00, 0x20, 0x05, 0x10, 0xbf, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x20, 0x03, 0x20, 0x03, 0x28, 0x02, 0x14, 0x20, 0x05, 0x6a, 0x36, 0x02, + 0x14, 0x20, 0x08, 0x20, 0x05, 0x6a, 0x21, 0x06, 0x0b, 0x02, 0x40, 0x20, + 0x06, 0x20, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, + 0x1b, 0x0f, 0x0b, 0x20, 0x06, 0x20, 0x01, 0x6e, 0x0b, 0x04, 0x00, 0x20, + 0x00, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0xb3, 0x80, 0x80, + 0x80, 0x00, 0x0b, 0x55, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x41, 0x00, 0x28, + 0x02, 0xa8, 0xb4, 0x80, 0x80, 0x00, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x90, + 0xb4, 0x80, 0x80, 0x00, 0x21, 0x01, 0x41, 0x00, 0x41, 0x90, 0xb4, 0x80, + 0x80, 0x00, 0x36, 0x02, 0xa8, 0xb4, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x00, + 0x20, 0x00, 0x20, 0x00, 0x41, 0xcc, 0x00, 0x4b, 0x1b, 0x41, 0x01, 0x74, + 0x41, 0x80, 0x99, 0x80, 0x80, 0x00, 0x6a, 0x2f, 0x01, 0x00, 0x41, 0xef, + 0x8c, 0x80, 0x80, 0x00, 0x6a, 0x20, 0x01, 0x28, 0x02, 0x14, 0x10, 0xb4, + 0x80, 0x80, 0x80, 0x00, 0x0b, 0xb6, 0x02, 0x01, 0x01, 0x7f, 0x41, 0x01, + 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x01, 0x41, 0xff, 0x00, 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x00, 0x41, 0x01, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, + 0x28, 0x02, 0x90, 0xb4, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x01, 0x41, 0x80, 0x7f, 0x71, 0x41, 0x80, 0xbf, 0x03, 0x46, 0x0d, 0x00, + 0x41, 0x00, 0x41, 0x19, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0c, + 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x41, 0x01, 0x0f, + 0x0b, 0x02, 0x40, 0x20, 0x01, 0x41, 0xff, 0x0f, 0x4b, 0x0d, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, + 0x01, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0xc0, 0x01, 0x72, + 0x3a, 0x00, 0x00, 0x41, 0x02, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x01, 0x41, 0x80, 0xb0, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x80, + 0x40, 0x71, 0x41, 0x80, 0xc0, 0x03, 0x47, 0x0d, 0x01, 0x0b, 0x20, 0x00, + 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x02, + 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0xe0, 0x01, 0x72, 0x3a, + 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0x3f, 0x71, + 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x03, 0x0f, 0x0b, 0x02, + 0x40, 0x20, 0x01, 0x41, 0x80, 0x80, 0x7c, 0x6a, 0x41, 0xff, 0xff, 0x3f, + 0x4b, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, + 0x01, 0x72, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x20, 0x01, 0x41, 0x12, 0x76, + 0x41, 0xf0, 0x01, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, + 0x06, 0x76, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x02, + 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0x3f, 0x71, 0x41, 0x80, + 0x01, 0x72, 0x3a, 0x00, 0x01, 0x41, 0x04, 0x0f, 0x0b, 0x41, 0x00, 0x41, + 0x19, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x0b, 0x41, 0x7f, 0x21, + 0x03, 0x0b, 0x20, 0x03, 0x0b, 0x18, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, + 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x00, 0x10, + 0xb6, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x8f, 0x01, 0x02, 0x01, 0x7e, 0x01, + 0x7f, 0x02, 0x40, 0x20, 0x00, 0xbd, 0x22, 0x02, 0x42, 0x34, 0x88, 0xa7, + 0x41, 0xff, 0x0f, 0x71, 0x22, 0x03, 0x41, 0xff, 0x0f, 0x46, 0x0d, 0x00, + 0x02, 0x40, 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x20, 0x01, + 0x41, 0x00, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x43, 0xa2, 0x20, 0x01, 0x10, + 0xb8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, + 0x02, 0x00, 0x41, 0x40, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x0f, 0x0b, + 0x20, 0x01, 0x20, 0x03, 0x41, 0x82, 0x78, 0x6a, 0x36, 0x02, 0x00, 0x20, + 0x02, 0x42, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x80, 0x7f, + 0x83, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf0, 0x3f, 0x84, + 0xbf, 0x21, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x24, 0x01, 0x01, 0x7f, 0x20, + 0x00, 0x10, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, 0x7f, 0x41, + 0x00, 0x20, 0x02, 0x20, 0x00, 0x41, 0x01, 0x20, 0x02, 0x20, 0x01, 0x10, + 0xb2, 0x80, 0x80, 0x80, 0x00, 0x47, 0x1b, 0x0b, 0x8c, 0x03, 0x01, 0x03, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xd0, 0x01, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0xcc, 0x01, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x41, 0x20, 0x6a, + 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb8, 0x01, 0x6a, 0x42, + 0x00, 0x37, 0x03, 0x00, 0x20, 0x03, 0x41, 0xb0, 0x01, 0x6a, 0x42, 0x00, + 0x37, 0x03, 0x00, 0x20, 0x03, 0x42, 0x00, 0x37, 0x03, 0xa8, 0x01, 0x20, + 0x03, 0x42, 0x00, 0x37, 0x03, 0xa0, 0x01, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0xc8, 0x01, 0x02, 0x40, 0x02, 0x40, 0x41, 0x00, 0x20, 0x01, 0x20, + 0x03, 0x41, 0xc8, 0x01, 0x6a, 0x20, 0x03, 0x41, 0xd0, 0x00, 0x6a, 0x20, + 0x03, 0x41, 0xa0, 0x01, 0x6a, 0x10, 0xbb, 0x80, 0x80, 0x80, 0x00, 0x41, + 0x00, 0x4e, 0x0d, 0x00, 0x41, 0x7f, 0x21, 0x00, 0x0c, 0x01, 0x0b, 0x20, + 0x00, 0x28, 0x02, 0x00, 0x21, 0x04, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, + 0x3c, 0x41, 0x00, 0x4a, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x04, 0x41, 0x5f, + 0x71, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x0d, 0x00, 0x20, 0x00, 0x41, 0xd0, + 0x00, 0x36, 0x02, 0x2c, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, 0x18, 0x20, + 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x00, 0x28, 0x02, 0x28, 0x21, + 0x05, 0x20, 0x00, 0x20, 0x03, 0x36, 0x02, 0x28, 0x0c, 0x01, 0x0b, 0x41, + 0x00, 0x21, 0x05, 0x20, 0x00, 0x28, 0x02, 0x10, 0x0d, 0x01, 0x0b, 0x41, + 0x7f, 0x21, 0x02, 0x20, 0x00, 0x10, 0xb0, 0x80, 0x80, 0x80, 0x00, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x03, 0x41, 0xc8, 0x01, 0x6a, + 0x20, 0x03, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x03, 0x41, 0xa0, 0x01, 0x6a, + 0x10, 0xbb, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x0b, 0x20, 0x04, 0x41, + 0x20, 0x71, 0x21, 0x01, 0x02, 0x40, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x28, 0x02, 0x20, 0x11, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x1a, 0x20, 0x00, 0x41, 0x00, 0x36, 0x02, + 0x2c, 0x20, 0x00, 0x20, 0x05, 0x36, 0x02, 0x28, 0x20, 0x00, 0x41, 0x00, + 0x36, 0x02, 0x18, 0x20, 0x00, 0x28, 0x02, 0x14, 0x21, 0x05, 0x20, 0x00, + 0x42, 0x00, 0x37, 0x03, 0x10, 0x20, 0x02, 0x41, 0x7f, 0x20, 0x05, 0x1b, + 0x21, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x05, + 0x20, 0x01, 0x72, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x20, 0x02, 0x20, 0x05, + 0x41, 0x20, 0x71, 0x1b, 0x21, 0x00, 0x0b, 0x20, 0x03, 0x41, 0xd0, 0x01, + 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0b, 0xf5, 0x46, + 0x05, 0x1a, 0x7f, 0x02, 0x7e, 0x01, 0x7c, 0x08, 0x7f, 0x01, 0x7c, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0x06, 0x6b, 0x22, 0x05, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x41, + 0x0c, 0x6a, 0x21, 0x06, 0x41, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, + 0x6b, 0x21, 0x07, 0x20, 0x05, 0x41, 0xec, 0x60, 0x6a, 0x21, 0x08, 0x20, + 0x05, 0x41, 0x37, 0x6a, 0x21, 0x09, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, + 0x41, 0x0b, 0x6a, 0x21, 0x0a, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, + 0x7f, 0x6a, 0x21, 0x0b, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, 0x08, + 0x72, 0x21, 0x0c, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, 0x09, 0x72, + 0x21, 0x0d, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x41, 0x0a, 0x6a, 0x21, + 0x0e, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x21, 0x0f, 0x41, 0x00, 0x21, 0x10, + 0x41, 0x00, 0x21, 0x11, 0x41, 0x00, 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x03, 0x40, 0x20, 0x01, 0x21, 0x13, 0x20, 0x12, 0x20, 0x11, + 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x01, 0x20, 0x12, + 0x20, 0x11, 0x6a, 0x21, 0x11, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x13, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x13, 0x21, + 0x01, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, 0x41, + 0xff, 0x01, 0x71, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x25, + 0x47, 0x0d, 0x02, 0x20, 0x01, 0x21, 0x14, 0x20, 0x01, 0x21, 0x12, 0x03, + 0x40, 0x02, 0x40, 0x20, 0x12, 0x2d, 0x00, 0x01, 0x41, 0x25, 0x46, 0x0d, + 0x00, 0x20, 0x12, 0x21, 0x01, 0x0c, 0x03, 0x0b, 0x20, 0x14, 0x41, 0x01, + 0x6a, 0x21, 0x14, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x21, 0x15, 0x20, 0x12, + 0x41, 0x02, 0x6a, 0x22, 0x01, 0x21, 0x12, 0x20, 0x15, 0x41, 0x25, 0x46, + 0x0d, 0x00, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x01, 0x21, 0x14, 0x0b, 0x20, + 0x14, 0x20, 0x13, 0x6b, 0x22, 0x12, 0x20, 0x11, 0x41, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x73, 0x22, 0x14, 0x4a, 0x0d, 0x0c, 0x02, 0x40, 0x20, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x13, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x0d, 0x0b, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x12, 0x41, 0x7f, 0x21, 0x16, 0x02, 0x40, 0x20, 0x01, 0x2c, 0x00, + 0x01, 0x22, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x15, 0x41, 0x09, 0x4b, 0x0d, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, + 0x01, 0x41, 0x03, 0x6a, 0x21, 0x12, 0x20, 0x01, 0x2c, 0x00, 0x03, 0x21, + 0x17, 0x41, 0x01, 0x21, 0x10, 0x20, 0x15, 0x21, 0x16, 0x0b, 0x41, 0x00, + 0x21, 0x18, 0x02, 0x40, 0x20, 0x17, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, + 0x1f, 0x4b, 0x0d, 0x00, 0x41, 0x01, 0x20, 0x01, 0x74, 0x22, 0x01, 0x41, + 0x89, 0xd1, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x21, 0x15, 0x41, 0x00, 0x21, 0x18, 0x03, 0x40, 0x20, 0x01, 0x20, 0x18, + 0x72, 0x21, 0x18, 0x20, 0x15, 0x22, 0x12, 0x2c, 0x00, 0x00, 0x22, 0x17, + 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x20, 0x4f, 0x0d, 0x01, 0x20, 0x12, + 0x41, 0x01, 0x6a, 0x21, 0x15, 0x41, 0x01, 0x20, 0x01, 0x74, 0x22, 0x01, + 0x41, 0x89, 0xd1, 0x04, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, + 0x17, 0x41, 0x2a, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, + 0x2c, 0x00, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4b, 0x0d, + 0x00, 0x20, 0x12, 0x2d, 0x00, 0x02, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, + 0x04, 0x20, 0x01, 0x41, 0x02, 0x74, 0x6a, 0x41, 0x0a, 0x36, 0x02, 0x00, + 0x20, 0x12, 0x41, 0x03, 0x6a, 0x21, 0x15, 0x20, 0x12, 0x2c, 0x00, 0x01, + 0x41, 0x03, 0x74, 0x20, 0x03, 0x6a, 0x41, 0x80, 0x7d, 0x6a, 0x28, 0x02, + 0x00, 0x21, 0x19, 0x41, 0x01, 0x21, 0x10, 0x0c, 0x01, 0x0b, 0x20, 0x10, + 0x0d, 0x06, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x15, 0x02, 0x40, 0x20, + 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x10, 0x41, 0x00, 0x21, 0x19, 0x0c, + 0x06, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, + 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x01, 0x28, 0x02, 0x00, 0x21, 0x19, + 0x41, 0x00, 0x21, 0x10, 0x0b, 0x20, 0x19, 0x41, 0x7f, 0x4a, 0x0d, 0x04, + 0x41, 0x00, 0x20, 0x19, 0x6b, 0x21, 0x19, 0x20, 0x18, 0x41, 0x80, 0xc0, + 0x00, 0x72, 0x21, 0x18, 0x0c, 0x04, 0x0b, 0x41, 0x00, 0x21, 0x19, 0x02, + 0x40, 0x20, 0x17, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4d, 0x0d, + 0x00, 0x20, 0x12, 0x21, 0x15, 0x0c, 0x04, 0x0b, 0x41, 0x00, 0x21, 0x19, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x19, 0x41, 0xcc, 0x99, 0xb3, 0xe6, 0x00, + 0x4b, 0x0d, 0x00, 0x41, 0x7f, 0x20, 0x19, 0x41, 0x0a, 0x6c, 0x22, 0x15, + 0x20, 0x01, 0x6a, 0x20, 0x01, 0x20, 0x15, 0x41, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x73, 0x4b, 0x1b, 0x21, 0x19, 0x20, 0x12, 0x2c, 0x00, 0x01, 0x21, + 0x01, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x22, 0x15, 0x21, 0x12, 0x20, 0x01, + 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x0a, 0x49, 0x0d, 0x01, 0x20, 0x19, + 0x41, 0x00, 0x48, 0x0d, 0x0e, 0x0c, 0x05, 0x0b, 0x20, 0x12, 0x2c, 0x00, + 0x01, 0x21, 0x01, 0x41, 0x7f, 0x21, 0x19, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x21, 0x12, 0x20, 0x01, 0x41, 0x50, 0x6a, 0x22, 0x01, 0x41, 0x0a, 0x49, + 0x0d, 0x00, 0x0c, 0x0d, 0x0b, 0x0b, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, + 0x12, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x0d, 0x0b, 0x02, 0x40, 0x20, 0x10, 0x0d, 0x00, 0x41, 0x00, + 0x21, 0x11, 0x0c, 0x0c, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x04, 0x28, 0x02, 0x04, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x01, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x01, 0x20, 0x02, + 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, + 0x08, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x02, 0x21, 0x01, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, + 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x22, 0x01, + 0x0d, 0x00, 0x41, 0x03, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x18, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x10, 0x22, 0x01, 0x0d, 0x00, 0x41, + 0x04, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x20, + 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, + 0x04, 0x28, 0x02, 0x14, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x05, 0x21, 0x01, + 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x28, 0x6a, 0x20, 0x01, 0x20, 0x02, + 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, + 0x18, 0x22, 0x01, 0x0d, 0x00, 0x41, 0x06, 0x21, 0x01, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x41, 0x30, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, + 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x1c, 0x22, 0x01, + 0x0d, 0x00, 0x41, 0x07, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x38, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x28, 0x02, 0x20, 0x22, 0x01, 0x0d, 0x00, 0x41, + 0x08, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x41, 0xc0, 0x00, 0x6a, + 0x20, 0x01, 0x20, 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, + 0x28, 0x02, 0x24, 0x22, 0x01, 0x0d, 0x01, 0x41, 0x09, 0x21, 0x01, 0x0b, + 0x20, 0x01, 0x41, 0x02, 0x74, 0x21, 0x01, 0x03, 0x40, 0x20, 0x04, 0x20, + 0x01, 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, + 0x22, 0x01, 0x41, 0x28, 0x47, 0x0d, 0x00, 0x0b, 0x41, 0x01, 0x21, 0x11, + 0x0c, 0x0c, 0x0b, 0x20, 0x03, 0x41, 0xc8, 0x00, 0x6a, 0x20, 0x01, 0x20, + 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x41, 0x01, 0x21, 0x11, 0x0c, + 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x12, 0x41, 0x7f, 0x21, 0x17, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x15, 0x2d, 0x00, 0x00, 0x41, 0x2e, 0x46, 0x0d, 0x00, + 0x20, 0x15, 0x21, 0x01, 0x41, 0x00, 0x21, 0x1a, 0x0c, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x15, 0x2c, 0x00, 0x01, 0x22, 0x17, 0x41, 0x2a, 0x47, 0x0d, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x15, 0x2c, 0x00, 0x02, 0x41, 0x50, + 0x6a, 0x22, 0x01, 0x41, 0x09, 0x4b, 0x0d, 0x00, 0x20, 0x15, 0x2d, 0x00, + 0x03, 0x41, 0x24, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x01, 0x41, 0x02, + 0x74, 0x6a, 0x41, 0x0a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x41, 0x04, 0x6a, + 0x21, 0x01, 0x20, 0x15, 0x2c, 0x00, 0x02, 0x41, 0x03, 0x74, 0x20, 0x03, + 0x6a, 0x41, 0x80, 0x7d, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x17, 0x0c, 0x01, + 0x0b, 0x20, 0x10, 0x0d, 0x03, 0x20, 0x15, 0x41, 0x02, 0x6a, 0x21, 0x01, + 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x17, 0x0c, 0x01, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x15, 0x41, 0x04, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x15, 0x28, 0x02, 0x00, 0x21, 0x17, 0x0b, + 0x20, 0x17, 0x41, 0x7f, 0x73, 0x41, 0x1f, 0x76, 0x21, 0x1a, 0x0c, 0x01, + 0x0b, 0x20, 0x15, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x02, 0x40, 0x20, 0x17, + 0x41, 0x50, 0x6a, 0x22, 0x1b, 0x41, 0x09, 0x4d, 0x0d, 0x00, 0x41, 0x01, + 0x21, 0x1a, 0x41, 0x00, 0x21, 0x17, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, + 0x1c, 0x20, 0x01, 0x21, 0x15, 0x03, 0x40, 0x41, 0x7f, 0x21, 0x17, 0x02, + 0x40, 0x20, 0x1c, 0x41, 0xcc, 0x99, 0xb3, 0xe6, 0x00, 0x4b, 0x0d, 0x00, + 0x41, 0x7f, 0x20, 0x1c, 0x41, 0x0a, 0x6c, 0x22, 0x01, 0x20, 0x1b, 0x6a, + 0x20, 0x1b, 0x20, 0x01, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4b, + 0x1b, 0x21, 0x17, 0x0b, 0x41, 0x01, 0x21, 0x1a, 0x20, 0x15, 0x2c, 0x00, + 0x01, 0x21, 0x1b, 0x20, 0x17, 0x21, 0x1c, 0x20, 0x15, 0x41, 0x01, 0x6a, + 0x22, 0x01, 0x21, 0x15, 0x20, 0x1b, 0x41, 0x50, 0x6a, 0x22, 0x1b, 0x41, + 0x0a, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x03, 0x40, 0x20, 0x12, 0x21, 0x15, + 0x20, 0x01, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, 0x85, 0x7f, 0x6a, 0x41, + 0x46, 0x49, 0x0d, 0x01, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, + 0x12, 0x20, 0x15, 0x41, 0x3a, 0x6c, 0x6a, 0x41, 0xdf, 0x99, 0x80, 0x80, + 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x22, 0x12, 0x41, 0x7f, 0x6a, 0x41, 0x08, + 0x49, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x12, + 0x41, 0x1b, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x45, 0x0d, 0x03, 0x02, 0x40, + 0x20, 0x16, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x16, 0x41, + 0x02, 0x74, 0x6a, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x03, + 0x20, 0x16, 0x41, 0x03, 0x74, 0x6a, 0x29, 0x03, 0x00, 0x37, 0x03, 0x38, + 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, 0x00, 0x21, + 0x11, 0x0c, 0x0e, 0x0b, 0x20, 0x05, 0x41, 0x38, 0x6a, 0x20, 0x12, 0x20, + 0x02, 0x10, 0xbc, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x02, 0x0b, 0x20, 0x16, + 0x41, 0x7f, 0x4a, 0x0d, 0x02, 0x0b, 0x41, 0x00, 0x21, 0x12, 0x20, 0x00, + 0x45, 0x0d, 0x08, 0x0b, 0x20, 0x18, 0x41, 0xff, 0xff, 0x7b, 0x71, 0x22, + 0x1c, 0x20, 0x18, 0x20, 0x18, 0x41, 0x80, 0xc0, 0x00, 0x71, 0x1b, 0x21, + 0x16, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x01, 0x41, 0x7f, 0x6a, 0x2c, 0x00, 0x00, 0x22, 0x12, 0x41, 0x5f, 0x71, + 0x20, 0x12, 0x20, 0x12, 0x41, 0x0f, 0x71, 0x41, 0x03, 0x46, 0x1b, 0x20, + 0x12, 0x20, 0x15, 0x1b, 0x22, 0x1d, 0x41, 0xbf, 0x7f, 0x6a, 0x0e, 0x38, + 0x10, 0x12, 0x0d, 0x12, 0x10, 0x10, 0x10, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x0c, 0x12, 0x12, 0x12, 0x12, 0x03, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x12, 0x08, 0x05, + 0x10, 0x10, 0x10, 0x12, 0x05, 0x12, 0x12, 0x12, 0x09, 0x01, 0x04, 0x02, + 0x12, 0x12, 0x0a, 0x12, 0x00, 0x12, 0x12, 0x03, 0x12, 0x0b, 0x41, 0x00, + 0x21, 0x1b, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x05, + 0x29, 0x03, 0x38, 0x21, 0x1f, 0x0c, 0x05, 0x0b, 0x41, 0x00, 0x21, 0x12, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x15, 0x41, 0xff, 0x01, 0x71, 0x0e, 0x08, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x1d, 0x05, 0x06, 0x1d, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1c, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, 0x0c, 0x1b, 0x0b, 0x20, 0x05, + 0x28, 0x02, 0x38, 0x20, 0x11, 0xac, 0x37, 0x03, 0x00, 0x0c, 0x1a, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3b, 0x01, 0x00, 0x0c, 0x19, + 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x3a, 0x00, 0x00, 0x0c, + 0x18, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0x36, 0x02, 0x00, + 0x0c, 0x17, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x20, 0x11, 0xac, 0x37, + 0x03, 0x00, 0x0c, 0x16, 0x0b, 0x20, 0x17, 0x41, 0x08, 0x20, 0x17, 0x41, + 0x08, 0x4b, 0x1b, 0x21, 0x17, 0x20, 0x16, 0x41, 0x08, 0x72, 0x21, 0x16, + 0x41, 0xf8, 0x00, 0x21, 0x1d, 0x0b, 0x41, 0x00, 0x21, 0x1b, 0x41, 0x80, + 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, + 0x38, 0x22, 0x1f, 0x50, 0x45, 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x0c, + 0x04, 0x0b, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, 0x0f, 0x21, + 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, 0x20, 0x1f, + 0xa7, 0x41, 0x0f, 0x71, 0x41, 0xf0, 0x9d, 0x80, 0x80, 0x00, 0x6a, 0x2d, + 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x1f, 0x42, 0x0f, + 0x56, 0x21, 0x12, 0x20, 0x1f, 0x42, 0x04, 0x88, 0x21, 0x1f, 0x20, 0x12, + 0x0d, 0x00, 0x0b, 0x20, 0x16, 0x41, 0x08, 0x71, 0x45, 0x0d, 0x03, 0x20, + 0x1d, 0x41, 0x04, 0x75, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x6a, 0x21, + 0x1e, 0x41, 0x02, 0x21, 0x1b, 0x0c, 0x03, 0x0b, 0x20, 0x0f, 0x21, 0x13, + 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, 0x22, 0x1f, 0x50, 0x0d, 0x00, + 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, + 0x13, 0x20, 0x1f, 0xa7, 0x41, 0x07, 0x71, 0x41, 0x30, 0x72, 0x3a, 0x00, + 0x00, 0x20, 0x1f, 0x42, 0x07, 0x56, 0x21, 0x12, 0x20, 0x1f, 0x42, 0x03, + 0x88, 0x21, 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, + 0x1b, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x16, 0x41, + 0x08, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x17, 0x20, 0x0f, 0x20, 0x13, 0x6b, + 0x22, 0x12, 0x41, 0x01, 0x6a, 0x20, 0x17, 0x20, 0x12, 0x4a, 0x1b, 0x21, + 0x17, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, 0x22, + 0x1f, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x05, 0x42, 0x00, 0x20, 0x1f, + 0x7d, 0x22, 0x1f, 0x37, 0x03, 0x38, 0x41, 0x01, 0x21, 0x1b, 0x41, 0x80, + 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x16, 0x41, 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x1b, + 0x41, 0x81, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x0c, 0x01, 0x0b, 0x41, + 0x82, 0x88, 0x80, 0x80, 0x00, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x20, + 0x16, 0x41, 0x01, 0x71, 0x22, 0x1b, 0x1b, 0x21, 0x1e, 0x0b, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x1f, 0x42, 0x80, 0x80, 0x80, 0x80, 0x10, 0x5a, 0x0d, + 0x00, 0x20, 0x1f, 0x21, 0x20, 0x20, 0x0f, 0x21, 0x13, 0x0c, 0x01, 0x0b, + 0x20, 0x0f, 0x21, 0x13, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, + 0x13, 0x20, 0x1f, 0x20, 0x1f, 0x42, 0x0a, 0x80, 0x22, 0x20, 0x42, 0x0a, + 0x7e, 0x7d, 0xa7, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x1f, 0x42, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0x01, 0x56, 0x21, 0x12, 0x20, 0x20, 0x21, + 0x1f, 0x20, 0x12, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x20, 0xa7, 0x22, 0x12, + 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, + 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, 0x41, 0x0a, 0x6c, + 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x12, 0x41, 0x09, 0x4b, + 0x21, 0x18, 0x20, 0x15, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x0b, + 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, 0x17, 0x41, 0x00, 0x48, + 0x0d, 0x12, 0x0b, 0x20, 0x16, 0x41, 0xff, 0xff, 0x7b, 0x71, 0x20, 0x16, + 0x20, 0x1a, 0x1b, 0x21, 0x1c, 0x02, 0x40, 0x20, 0x05, 0x29, 0x03, 0x38, + 0x22, 0x1f, 0x42, 0x00, 0x52, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x18, 0x20, + 0x17, 0x0d, 0x00, 0x20, 0x0f, 0x21, 0x13, 0x20, 0x0f, 0x21, 0x12, 0x0c, + 0x0c, 0x0b, 0x20, 0x17, 0x20, 0x0f, 0x20, 0x13, 0x6b, 0x20, 0x1f, 0x50, + 0x6a, 0x22, 0x12, 0x20, 0x17, 0x20, 0x12, 0x4a, 0x1b, 0x21, 0x18, 0x20, + 0x0f, 0x21, 0x12, 0x0c, 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, 0x29, 0x03, + 0x38, 0x3c, 0x00, 0x37, 0x41, 0x00, 0x21, 0x1b, 0x41, 0x80, 0x88, 0x80, + 0x80, 0x00, 0x21, 0x1e, 0x41, 0x01, 0x21, 0x18, 0x20, 0x09, 0x21, 0x13, + 0x20, 0x0f, 0x21, 0x12, 0x0c, 0x0a, 0x0b, 0x41, 0x80, 0xa8, 0x80, 0x80, + 0x00, 0x28, 0x02, 0x00, 0x10, 0xb5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x13, + 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x22, 0x12, 0x41, 0xab, + 0x89, 0x80, 0x80, 0x00, 0x20, 0x12, 0x1b, 0x21, 0x13, 0x0b, 0x20, 0x13, + 0x20, 0x13, 0x20, 0x17, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x20, 0x17, + 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x1b, 0x10, 0xc3, 0x80, 0x80, + 0x80, 0x00, 0x22, 0x18, 0x6a, 0x21, 0x12, 0x41, 0x00, 0x21, 0x1b, 0x41, + 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, 0x17, 0x41, 0x7f, 0x4a, + 0x0d, 0x07, 0x20, 0x12, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x07, 0x0c, 0x0d, + 0x0b, 0x20, 0x05, 0x28, 0x02, 0x38, 0x21, 0x13, 0x20, 0x17, 0x0d, 0x01, + 0x41, 0x00, 0x21, 0x12, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x41, 0x00, 0x36, + 0x02, 0x0c, 0x20, 0x05, 0x20, 0x05, 0x29, 0x03, 0x38, 0x3e, 0x02, 0x08, + 0x20, 0x05, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x38, 0x20, 0x05, + 0x41, 0x08, 0x6a, 0x21, 0x13, 0x41, 0x7f, 0x21, 0x17, 0x0b, 0x41, 0x00, + 0x21, 0x12, 0x20, 0x13, 0x21, 0x14, 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, + 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x05, + 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x15, 0x41, 0x00, 0x48, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x15, 0x20, 0x17, + 0x20, 0x12, 0x6b, 0x4b, 0x0d, 0x00, 0x20, 0x14, 0x41, 0x04, 0x6a, 0x21, + 0x14, 0x20, 0x15, 0x20, 0x12, 0x6a, 0x22, 0x12, 0x20, 0x17, 0x49, 0x0d, + 0x01, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x18, 0x0d, 0x0c, 0x0b, 0x20, 0x12, + 0x41, 0x00, 0x48, 0x0d, 0x0a, 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, + 0xc0, 0x04, 0x71, 0x22, 0x18, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x12, 0x4c, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x19, + 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, + 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x13, 0x28, 0x02, 0x00, 0x22, 0x15, 0x45, 0x0d, 0x01, 0x20, 0x05, + 0x41, 0x04, 0x6a, 0x20, 0x15, 0x10, 0xb7, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x15, 0x20, 0x14, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x4b, 0x0d, 0x01, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0x04, 0x6a, 0x20, 0x15, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x13, 0x41, 0x04, 0x6a, 0x21, 0x13, 0x20, + 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x18, + 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x12, 0x4c, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x19, + 0x20, 0x12, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, + 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x19, 0x20, 0x12, 0x20, 0x19, 0x20, 0x12, 0x4a, 0x1b, 0x21, 0x12, 0x0c, + 0x08, 0x0b, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, 0x20, 0x17, 0x41, + 0x00, 0x48, 0x0d, 0x09, 0x0b, 0x20, 0x05, 0x2b, 0x03, 0x38, 0x21, 0x21, + 0x20, 0x05, 0x41, 0x00, 0x36, 0x02, 0x6c, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x21, 0xbd, 0x42, 0x7f, 0x55, 0x0d, 0x00, 0x20, 0x21, 0x9a, 0x21, 0x21, + 0x41, 0x01, 0x21, 0x22, 0x41, 0x00, 0x21, 0x23, 0x41, 0x8a, 0x88, 0x80, + 0x80, 0x00, 0x21, 0x24, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, + 0x80, 0x10, 0x71, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x22, 0x41, 0x00, + 0x21, 0x23, 0x41, 0x8d, 0x88, 0x80, 0x80, 0x00, 0x21, 0x24, 0x0c, 0x01, + 0x0b, 0x41, 0x90, 0x88, 0x80, 0x80, 0x00, 0x41, 0x8b, 0x88, 0x80, 0x80, + 0x00, 0x20, 0x16, 0x41, 0x01, 0x71, 0x22, 0x22, 0x1b, 0x21, 0x24, 0x20, + 0x22, 0x45, 0x21, 0x23, 0x0b, 0x02, 0x40, 0x20, 0x21, 0xbd, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x83, 0x42, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf8, 0xff, 0x00, 0x53, 0x0d, 0x00, + 0x20, 0x22, 0x41, 0x03, 0x6a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x16, 0x41, + 0x80, 0xc0, 0x00, 0x71, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, 0x4c, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, + 0x14, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x12, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x24, 0x20, 0x22, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x21, 0x12, 0x0b, 0x02, 0x40, 0x20, + 0x12, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, 0x83, 0x89, 0x80, 0x80, 0x00, + 0x41, 0xa1, 0x89, 0x80, 0x80, 0x00, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x22, + 0x12, 0x1b, 0x41, 0x87, 0x89, 0x80, 0x80, 0x00, 0x41, 0xa5, 0x89, 0x80, + 0x80, 0x00, 0x20, 0x12, 0x1b, 0x20, 0x21, 0x20, 0x21, 0x62, 0x1b, 0x41, + 0x03, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x41, 0x80, 0xc0, 0x00, + 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x14, 0x4c, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x14, 0x6b, 0x22, + 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x15, + 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x15, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, + 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, + 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x20, 0x19, 0x20, + 0x14, 0x20, 0x19, 0x4a, 0x1b, 0x21, 0x12, 0x0c, 0x08, 0x0b, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x20, 0x05, 0x41, 0xec, 0x00, 0x6a, + 0x10, 0xb8, 0x80, 0x80, 0x80, 0x00, 0x22, 0x21, 0x20, 0x21, 0xa0, 0x22, + 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x22, 0x12, 0x41, 0x7f, + 0x6a, 0x36, 0x02, 0x6c, 0x20, 0x1d, 0x41, 0x20, 0x72, 0x22, 0x25, 0x41, + 0xe1, 0x00, 0x47, 0x0d, 0x01, 0x0c, 0x08, 0x0b, 0x20, 0x1d, 0x41, 0x20, + 0x72, 0x22, 0x25, 0x41, 0xe1, 0x00, 0x46, 0x0d, 0x07, 0x41, 0x06, 0x20, + 0x17, 0x20, 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, 0x05, 0x28, + 0x02, 0x6c, 0x21, 0x13, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x20, 0x12, 0x41, + 0x63, 0x6a, 0x22, 0x13, 0x36, 0x02, 0x6c, 0x41, 0x06, 0x20, 0x17, 0x20, + 0x17, 0x41, 0x00, 0x48, 0x1b, 0x21, 0x1a, 0x20, 0x21, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x41, 0xa2, 0x21, 0x21, 0x0b, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x00, 0x41, 0xc8, 0x00, 0x20, 0x13, 0x41, + 0x00, 0x48, 0x22, 0x26, 0x1b, 0x41, 0x02, 0x74, 0x22, 0x27, 0x6a, 0x22, + 0x1e, 0x21, 0x14, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x41, 0x63, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x21, 0xab, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, + 0x12, 0x0b, 0x20, 0x14, 0x20, 0x12, 0x36, 0x02, 0x00, 0x20, 0x14, 0x41, + 0x04, 0x6a, 0x21, 0x14, 0x20, 0x21, 0x20, 0x12, 0xb8, 0xa1, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x65, 0xcd, 0xcd, 0x41, 0xa2, 0x22, 0x21, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x13, 0x41, 0x01, 0x4e, 0x0d, 0x00, 0x20, 0x14, + 0x21, 0x12, 0x20, 0x1e, 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, 0x1e, 0x21, + 0x15, 0x03, 0x40, 0x20, 0x13, 0x41, 0x1d, 0x20, 0x13, 0x41, 0x1d, 0x48, + 0x1b, 0x21, 0x13, 0x02, 0x40, 0x20, 0x14, 0x41, 0x7c, 0x6a, 0x22, 0x12, + 0x20, 0x15, 0x49, 0x0d, 0x00, 0x20, 0x13, 0xad, 0x21, 0x20, 0x42, 0x00, + 0x21, 0x1f, 0x03, 0x40, 0x20, 0x12, 0x20, 0x12, 0x35, 0x02, 0x00, 0x20, + 0x20, 0x86, 0x20, 0x1f, 0x42, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x83, 0x7c, + 0x22, 0x1f, 0x20, 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x80, 0x22, + 0x1f, 0x42, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x7e, 0x7d, 0x3e, 0x02, 0x00, + 0x20, 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x12, 0x20, 0x15, 0x4f, 0x0d, 0x00, + 0x0b, 0x20, 0x1f, 0xa7, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x20, 0x15, 0x41, + 0x7c, 0x6a, 0x22, 0x15, 0x20, 0x12, 0x36, 0x02, 0x00, 0x0b, 0x02, 0x40, + 0x03, 0x40, 0x20, 0x14, 0x22, 0x12, 0x20, 0x15, 0x4d, 0x0d, 0x01, 0x20, + 0x12, 0x41, 0x7c, 0x6a, 0x22, 0x14, 0x28, 0x02, 0x00, 0x45, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, 0x13, 0x6b, + 0x22, 0x13, 0x36, 0x02, 0x6c, 0x20, 0x12, 0x21, 0x14, 0x20, 0x13, 0x41, + 0x00, 0x4a, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x13, 0x41, 0x7f, + 0x4a, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x19, 0x6a, 0x41, 0x09, 0x6e, 0x41, + 0x01, 0x6a, 0x21, 0x28, 0x03, 0x40, 0x41, 0x00, 0x20, 0x13, 0x6b, 0x22, + 0x14, 0x41, 0x09, 0x20, 0x14, 0x41, 0x09, 0x48, 0x1b, 0x21, 0x17, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x15, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x20, 0x15, + 0x28, 0x02, 0x00, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, 0x94, 0xeb, + 0xdc, 0x03, 0x20, 0x17, 0x76, 0x21, 0x1c, 0x41, 0x7f, 0x20, 0x17, 0x74, + 0x41, 0x7f, 0x73, 0x21, 0x1b, 0x41, 0x00, 0x21, 0x13, 0x20, 0x15, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, 0x22, 0x18, + 0x20, 0x17, 0x76, 0x20, 0x13, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x18, 0x20, + 0x1b, 0x71, 0x20, 0x1c, 0x6c, 0x21, 0x13, 0x20, 0x14, 0x41, 0x04, 0x6a, + 0x22, 0x14, 0x20, 0x12, 0x49, 0x0d, 0x00, 0x0b, 0x20, 0x15, 0x28, 0x02, + 0x00, 0x21, 0x14, 0x20, 0x13, 0x45, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x13, + 0x36, 0x02, 0x00, 0x20, 0x12, 0x41, 0x04, 0x6a, 0x21, 0x12, 0x0b, 0x20, + 0x05, 0x20, 0x05, 0x28, 0x02, 0x6c, 0x20, 0x17, 0x6a, 0x22, 0x13, 0x36, + 0x02, 0x6c, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x14, 0x45, 0x41, 0x02, 0x74, + 0x6a, 0x22, 0x15, 0x20, 0x25, 0x41, 0xe6, 0x00, 0x46, 0x1b, 0x22, 0x14, + 0x20, 0x28, 0x41, 0x02, 0x74, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x20, 0x14, + 0x6b, 0x41, 0x02, 0x75, 0x20, 0x28, 0x4a, 0x1b, 0x21, 0x12, 0x20, 0x13, + 0x41, 0x00, 0x48, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x18, 0x02, + 0x40, 0x20, 0x15, 0x20, 0x12, 0x4f, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x15, + 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, 0x15, 0x28, + 0x02, 0x00, 0x22, 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, 0x0a, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, 0x20, 0x13, + 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, 0x0b, 0x0b, + 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x20, 0x18, 0x20, 0x25, 0x41, 0xe6, + 0x00, 0x46, 0x1b, 0x6b, 0x20, 0x1a, 0x41, 0x00, 0x47, 0x20, 0x25, 0x41, + 0xe7, 0x00, 0x46, 0x22, 0x1b, 0x71, 0x6b, 0x22, 0x14, 0x20, 0x12, 0x20, + 0x1e, 0x6b, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x41, 0x77, 0x6a, 0x4e, + 0x0d, 0x00, 0x20, 0x14, 0x41, 0x80, 0xc8, 0x00, 0x6a, 0x22, 0x13, 0x41, + 0x09, 0x6d, 0x22, 0x17, 0x41, 0x02, 0x74, 0x22, 0x29, 0x20, 0x05, 0x41, + 0xf0, 0x00, 0x6a, 0x41, 0x01, 0x41, 0xc9, 0x00, 0x20, 0x26, 0x1b, 0x41, + 0x02, 0x74, 0x22, 0x26, 0x6a, 0x6a, 0x41, 0x80, 0x60, 0x6a, 0x21, 0x1c, + 0x41, 0x0a, 0x21, 0x14, 0x02, 0x40, 0x20, 0x13, 0x20, 0x17, 0x41, 0x09, + 0x6c, 0x6b, 0x22, 0x17, 0x41, 0x07, 0x4a, 0x0d, 0x00, 0x41, 0x08, 0x20, + 0x17, 0x6b, 0x22, 0x28, 0x41, 0x07, 0x71, 0x21, 0x13, 0x41, 0x0a, 0x21, + 0x14, 0x02, 0x40, 0x20, 0x17, 0x41, 0x7f, 0x6a, 0x41, 0x07, 0x49, 0x0d, + 0x00, 0x20, 0x28, 0x41, 0x78, 0x71, 0x21, 0x17, 0x41, 0x0a, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x14, 0x41, 0x80, 0xc2, 0xd7, 0x2f, 0x6c, 0x21, 0x14, + 0x20, 0x17, 0x41, 0x78, 0x6a, 0x22, 0x17, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x13, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x14, 0x41, 0x0a, 0x6c, 0x21, + 0x14, 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x22, 0x13, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x1c, 0x41, 0x04, 0x6a, 0x21, 0x28, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x1c, 0x28, 0x02, 0x00, 0x22, 0x13, 0x20, 0x13, 0x20, 0x14, 0x6e, 0x22, + 0x25, 0x20, 0x14, 0x6c, 0x6b, 0x22, 0x17, 0x0d, 0x00, 0x20, 0x28, 0x20, + 0x12, 0x46, 0x0d, 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x25, 0x41, + 0x01, 0x71, 0x0d, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x43, 0x21, 0x21, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, 0xdc, 0x03, 0x47, + 0x0d, 0x01, 0x20, 0x1c, 0x20, 0x15, 0x4d, 0x0d, 0x01, 0x20, 0x1c, 0x41, + 0x7c, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x0b, + 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x43, 0x21, 0x21, 0x0b, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x3f, 0x20, 0x28, 0x20, 0x12, 0x46, 0x1b, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x20, 0x17, 0x20, 0x14, 0x41, 0x01, + 0x76, 0x22, 0x28, 0x46, 0x1b, 0x20, 0x17, 0x20, 0x28, 0x49, 0x1b, 0x21, + 0x2a, 0x02, 0x40, 0x20, 0x23, 0x0d, 0x00, 0x20, 0x24, 0x2d, 0x00, 0x00, + 0x41, 0x2d, 0x47, 0x0d, 0x00, 0x20, 0x2a, 0x9a, 0x21, 0x2a, 0x20, 0x21, + 0x9a, 0x21, 0x21, 0x0b, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x17, 0x6b, 0x22, + 0x13, 0x36, 0x02, 0x00, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, 0x21, 0x61, + 0x0d, 0x00, 0x20, 0x1c, 0x20, 0x13, 0x20, 0x14, 0x6a, 0x22, 0x14, 0x36, + 0x02, 0x00, 0x02, 0x40, 0x20, 0x14, 0x41, 0x80, 0x94, 0xeb, 0xdc, 0x03, + 0x49, 0x0d, 0x00, 0x20, 0x08, 0x20, 0x26, 0x20, 0x29, 0x6a, 0x6a, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x04, 0x6a, 0x41, 0x00, 0x36, 0x02, + 0x00, 0x02, 0x40, 0x20, 0x14, 0x20, 0x15, 0x4f, 0x0d, 0x00, 0x20, 0x15, + 0x41, 0x7c, 0x6a, 0x22, 0x15, 0x41, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x20, + 0x14, 0x20, 0x14, 0x28, 0x02, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x13, 0x36, + 0x02, 0x00, 0x20, 0x14, 0x41, 0x7c, 0x6a, 0x21, 0x14, 0x20, 0x13, 0x41, + 0xff, 0x93, 0xeb, 0xdc, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x41, + 0x04, 0x6a, 0x21, 0x1c, 0x0b, 0x20, 0x1e, 0x20, 0x15, 0x6b, 0x41, 0x02, + 0x75, 0x41, 0x09, 0x6c, 0x21, 0x18, 0x20, 0x15, 0x28, 0x02, 0x00, 0x22, + 0x13, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, 0x03, 0x40, + 0x20, 0x18, 0x41, 0x01, 0x6a, 0x21, 0x18, 0x20, 0x13, 0x20, 0x14, 0x41, + 0x0a, 0x6c, 0x22, 0x14, 0x4f, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x1c, 0x41, + 0x04, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x20, 0x14, 0x4b, 0x1b, + 0x21, 0x12, 0x0b, 0x20, 0x07, 0x20, 0x12, 0x6a, 0x20, 0x27, 0x6b, 0x21, + 0x14, 0x02, 0x40, 0x03, 0x40, 0x20, 0x14, 0x21, 0x13, 0x20, 0x12, 0x22, + 0x1c, 0x20, 0x15, 0x4d, 0x22, 0x17, 0x0d, 0x01, 0x20, 0x13, 0x41, 0x7c, + 0x6a, 0x21, 0x14, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x22, 0x12, 0x28, 0x02, + 0x00, 0x45, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1b, + 0x0d, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, 0x21, 0x28, 0x0c, 0x01, 0x0b, + 0x20, 0x18, 0x41, 0x7f, 0x73, 0x41, 0x7f, 0x20, 0x1a, 0x41, 0x01, 0x20, + 0x1a, 0x1b, 0x22, 0x12, 0x20, 0x18, 0x4a, 0x20, 0x18, 0x41, 0x7b, 0x4a, + 0x71, 0x22, 0x14, 0x1b, 0x20, 0x12, 0x6a, 0x21, 0x1a, 0x41, 0x7f, 0x41, + 0x7e, 0x20, 0x14, 0x1b, 0x20, 0x1d, 0x6a, 0x21, 0x1d, 0x20, 0x16, 0x41, + 0x08, 0x71, 0x22, 0x28, 0x0d, 0x00, 0x41, 0x77, 0x21, 0x12, 0x02, 0x40, + 0x20, 0x17, 0x0d, 0x00, 0x20, 0x1c, 0x41, 0x7c, 0x6a, 0x28, 0x02, 0x00, + 0x22, 0x17, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x12, 0x20, 0x17, 0x41, + 0x0a, 0x70, 0x0d, 0x00, 0x41, 0x0a, 0x21, 0x14, 0x41, 0x00, 0x21, 0x12, + 0x03, 0x40, 0x20, 0x12, 0x41, 0x7f, 0x6a, 0x21, 0x12, 0x20, 0x17, 0x20, + 0x14, 0x41, 0x0a, 0x6c, 0x22, 0x14, 0x70, 0x45, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x13, 0x41, 0x02, 0x75, 0x41, 0x09, 0x6c, 0x21, 0x14, 0x02, 0x40, + 0x20, 0x1d, 0x41, 0x5f, 0x71, 0x41, 0xc6, 0x00, 0x47, 0x0d, 0x00, 0x41, + 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x14, 0x20, 0x12, 0x6a, 0x41, 0x77, + 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, 0x12, 0x41, 0x00, 0x4a, 0x1b, 0x22, + 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, 0x1b, 0x21, 0x1a, 0x0c, 0x01, 0x0b, + 0x41, 0x00, 0x21, 0x28, 0x20, 0x1a, 0x20, 0x18, 0x20, 0x14, 0x6a, 0x20, + 0x12, 0x6a, 0x41, 0x77, 0x6a, 0x22, 0x12, 0x41, 0x00, 0x20, 0x12, 0x41, + 0x00, 0x4a, 0x1b, 0x22, 0x12, 0x20, 0x1a, 0x20, 0x12, 0x48, 0x1b, 0x21, + 0x1a, 0x0b, 0x20, 0x1a, 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, 0x41, 0xfe, + 0xff, 0xff, 0xff, 0x07, 0x20, 0x1a, 0x20, 0x28, 0x72, 0x22, 0x23, 0x1b, + 0x4a, 0x0d, 0x08, 0x20, 0x1a, 0x20, 0x23, 0x41, 0x00, 0x47, 0x6a, 0x41, + 0x01, 0x6a, 0x21, 0x25, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1d, 0x41, 0x5f, + 0x71, 0x41, 0xc6, 0x00, 0x47, 0x22, 0x26, 0x0d, 0x00, 0x20, 0x18, 0x20, + 0x25, 0x41, 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x0a, 0x20, + 0x18, 0x41, 0x00, 0x20, 0x18, 0x41, 0x00, 0x4a, 0x1b, 0x21, 0x12, 0x0c, + 0x01, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x18, 0x0d, 0x00, 0x20, 0x06, + 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x20, 0x18, 0x20, + 0x18, 0x41, 0x1f, 0x75, 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, 0x21, 0x12, + 0x20, 0x06, 0x21, 0x13, 0x20, 0x06, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, + 0x41, 0x7f, 0x6a, 0x22, 0x14, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, + 0x22, 0x17, 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, + 0x20, 0x13, 0x41, 0x7f, 0x6a, 0x21, 0x13, 0x20, 0x12, 0x41, 0x09, 0x4b, + 0x21, 0x1b, 0x20, 0x17, 0x21, 0x12, 0x20, 0x1b, 0x0d, 0x00, 0x0b, 0x0b, + 0x02, 0x40, 0x20, 0x06, 0x20, 0x13, 0x6b, 0x41, 0x01, 0x4a, 0x0d, 0x00, + 0x20, 0x14, 0x20, 0x0e, 0x20, 0x13, 0x6b, 0x6a, 0x22, 0x14, 0x41, 0x30, + 0x20, 0x13, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x6b, 0x41, 0x76, 0x6a, + 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x7e, + 0x6a, 0x22, 0x27, 0x20, 0x1d, 0x3a, 0x00, 0x00, 0x20, 0x14, 0x41, 0x7f, + 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, 0x41, 0x00, 0x48, 0x1b, 0x3a, + 0x00, 0x00, 0x20, 0x06, 0x20, 0x27, 0x6b, 0x22, 0x12, 0x20, 0x25, 0x41, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x73, 0x4a, 0x0d, 0x09, 0x0b, 0x20, 0x12, + 0x20, 0x25, 0x6a, 0x22, 0x12, 0x20, 0x22, 0x41, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x73, 0x4a, 0x0d, 0x08, 0x20, 0x12, 0x20, 0x22, 0x6a, 0x21, 0x1b, + 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, 0x16, 0x0d, + 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, + 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, + 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, + 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, + 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x24, 0x20, 0x22, 0x20, 0x00, 0x10, + 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x16, 0x41, + 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, 0x19, 0x20, + 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x26, + 0x0d, 0x03, 0x20, 0x1e, 0x20, 0x15, 0x20, 0x15, 0x20, 0x1e, 0x4b, 0x1b, + 0x22, 0x18, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x17, 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, + 0x41, 0x08, 0x21, 0x14, 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x20, 0x14, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, + 0x41, 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x14, + 0x41, 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x13, + 0x20, 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x41, + 0x01, 0x6a, 0x22, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6a, 0x21, + 0x12, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x46, 0x0d, 0x00, 0x20, 0x14, + 0x41, 0x02, 0x6a, 0x41, 0x02, 0x48, 0x0d, 0x04, 0x0c, 0x03, 0x0b, 0x20, + 0x14, 0x41, 0x08, 0x47, 0x0d, 0x03, 0x0c, 0x01, 0x0b, 0x41, 0x09, 0x21, + 0x15, 0x20, 0x17, 0x20, 0x18, 0x47, 0x0d, 0x01, 0x0b, 0x20, 0x05, 0x41, + 0x30, 0x3a, 0x00, 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, + 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x0b, 0x20, 0x15, 0x6a, 0x22, 0x12, + 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x12, 0x49, 0x1b, 0x22, 0x12, + 0x41, 0x30, 0x20, 0x15, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6a, 0x20, + 0x12, 0x6b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x12, + 0x20, 0x0d, 0x20, 0x12, 0x6b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, 0x17, 0x20, 0x1e, + 0x4d, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x23, 0x45, 0x0d, 0x00, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x41, 0xa9, 0x89, + 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x1a, 0x41, 0x01, 0x4e, + 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x17, 0x20, 0x1c, 0x49, 0x0d, 0x00, 0x20, 0x1a, 0x21, 0x12, 0x0c, 0x01, + 0x0b, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, 0x28, + 0x02, 0x00, 0x22, 0x12, 0x0d, 0x00, 0x20, 0x0d, 0x21, 0x14, 0x20, 0x0d, + 0x21, 0x15, 0x0c, 0x01, 0x0b, 0x20, 0x0d, 0x21, 0x15, 0x20, 0x0d, 0x21, + 0x14, 0x03, 0x40, 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, 0x14, 0x20, 0x12, + 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x13, 0x41, 0x0a, 0x6c, 0x6b, 0x41, + 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x15, 0x41, 0x7f, 0x6a, 0x21, 0x15, + 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x18, 0x20, 0x13, 0x21, 0x12, 0x20, + 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x4d, 0x0d, 0x01, 0x0b, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, + 0x6a, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x30, 0x20, 0x15, 0x20, 0x05, + 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x14, 0x20, 0x1a, 0x41, 0x09, 0x20, 0x1a, 0x41, 0x09, 0x48, + 0x1b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x1a, 0x41, 0x77, 0x6a, 0x21, 0x12, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, + 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x09, 0x4a, 0x21, + 0x14, 0x20, 0x12, 0x21, 0x1a, 0x20, 0x14, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x00, 0x41, 0x30, 0x20, 0x12, 0x41, 0x09, 0x6a, 0x41, 0x09, 0x41, 0x00, + 0x10, 0xbd, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x04, 0x0b, 0x41, 0x80, 0xa8, + 0x80, 0x80, 0x00, 0x41, 0x1c, 0x36, 0x02, 0x00, 0x0c, 0x08, 0x0b, 0x41, + 0x00, 0x21, 0x1b, 0x41, 0x80, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1e, 0x20, + 0x0f, 0x21, 0x12, 0x20, 0x16, 0x21, 0x1c, 0x20, 0x17, 0x21, 0x18, 0x0b, + 0x20, 0x18, 0x20, 0x12, 0x20, 0x13, 0x6b, 0x22, 0x17, 0x20, 0x18, 0x20, + 0x17, 0x4a, 0x1b, 0x22, 0x1a, 0x20, 0x1b, 0x41, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x73, 0x4a, 0x0d, 0x05, 0x20, 0x19, 0x20, 0x1b, 0x20, 0x1a, 0x6a, + 0x22, 0x15, 0x20, 0x19, 0x20, 0x15, 0x4a, 0x1b, 0x22, 0x12, 0x20, 0x14, + 0x4a, 0x0d, 0x05, 0x02, 0x40, 0x20, 0x1c, 0x41, 0x80, 0xc0, 0x04, 0x71, + 0x22, 0x1c, 0x0d, 0x00, 0x20, 0x15, 0x20, 0x19, 0x4e, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x12, 0x20, 0x15, 0x6b, + 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, 0x22, + 0x16, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, + 0x16, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, + 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, + 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, 0x4b, + 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, + 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x1b, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, + 0x20, 0x1c, 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x15, 0x20, + 0x19, 0x4e, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x30, + 0x20, 0x12, 0x20, 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, + 0x41, 0x80, 0x02, 0x49, 0x22, 0x1b, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x02, 0x40, 0x20, 0x1b, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x02, 0x40, 0x20, 0x17, 0x20, 0x18, 0x4e, 0x0d, 0x00, 0x20, 0x05, + 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x30, 0x20, 0x1a, 0x20, 0x17, 0x6b, 0x22, + 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, 0x49, 0x22, 0x18, + 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x18, + 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x80, + 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, 0x01, 0x4b, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, + 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x13, 0x20, 0x17, 0x20, + 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x1c, 0x41, + 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x04, 0x20, 0x15, 0x20, 0x19, 0x4e, 0x0d, + 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x41, 0x20, 0x20, 0x12, 0x20, + 0x15, 0x6b, 0x22, 0x14, 0x41, 0x80, 0x02, 0x20, 0x14, 0x41, 0x80, 0x02, + 0x49, 0x22, 0x15, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, + 0x40, 0x20, 0x15, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x00, + 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x14, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x14, 0x41, 0xff, + 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, + 0x20, 0x71, 0x0d, 0x04, 0x20, 0x05, 0x41, 0xf0, 0x00, 0x6a, 0x20, 0x14, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0c, 0x04, 0x0b, + 0x02, 0x40, 0x20, 0x1a, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x1c, 0x20, + 0x15, 0x41, 0x04, 0x6a, 0x20, 0x1c, 0x20, 0x15, 0x4b, 0x1b, 0x21, 0x1c, + 0x20, 0x15, 0x21, 0x17, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, + 0x28, 0x02, 0x00, 0x22, 0x12, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, + 0x08, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x13, 0x41, + 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x14, 0x41, + 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x18, 0x20, + 0x13, 0x21, 0x12, 0x20, 0x18, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, 0x09, + 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, 0x3a, 0x00, + 0x58, 0x20, 0x0c, 0x21, 0x12, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x17, + 0x20, 0x15, 0x46, 0x0d, 0x00, 0x20, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, + 0x6a, 0x4d, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x41, 0x30, + 0x20, 0x12, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x10, 0xc0, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x21, 0x12, + 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x12, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x01, 0x6a, 0x21, 0x12, + 0x02, 0x40, 0x20, 0x28, 0x0d, 0x00, 0x20, 0x1a, 0x41, 0x01, 0x48, 0x0d, + 0x01, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x41, 0xa9, 0x89, 0x80, 0x80, 0x00, 0x41, 0x01, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x0d, 0x20, 0x12, 0x6b, 0x21, + 0x14, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, + 0x00, 0x20, 0x12, 0x20, 0x14, 0x20, 0x1a, 0x20, 0x14, 0x20, 0x1a, 0x48, + 0x1b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, + 0x1a, 0x20, 0x14, 0x6b, 0x21, 0x1a, 0x20, 0x17, 0x41, 0x04, 0x6a, 0x22, + 0x17, 0x20, 0x1c, 0x4f, 0x0d, 0x01, 0x20, 0x1a, 0x41, 0x7f, 0x4a, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x30, 0x20, 0x1a, 0x41, 0x12, 0x6a, + 0x41, 0x12, 0x41, 0x00, 0x10, 0xbd, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x27, 0x20, 0x06, + 0x20, 0x27, 0x6b, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x01, 0x20, 0x19, + 0x20, 0x1b, 0x4c, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, + 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, + 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, + 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x01, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0c, 0x01, 0x0b, 0x20, 0x24, 0x20, 0x1d, 0x41, 0x1a, 0x74, 0x41, + 0x1f, 0x75, 0x41, 0x09, 0x71, 0x6a, 0x21, 0x1e, 0x02, 0x40, 0x20, 0x17, + 0x41, 0x0b, 0x4b, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x41, 0x0c, 0x20, + 0x17, 0x6b, 0x22, 0x12, 0x41, 0x07, 0x71, 0x22, 0x14, 0x0d, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, 0x0c, 0x01, + 0x0b, 0x20, 0x17, 0x41, 0x74, 0x6a, 0x21, 0x12, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0x21, 0x2a, 0x03, 0x40, 0x20, 0x12, 0x41, + 0x01, 0x6a, 0x21, 0x12, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x21, 0x2a, 0x20, 0x14, 0x41, 0x7f, 0x6a, 0x22, + 0x14, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x20, 0x12, 0x6b, 0x21, 0x12, 0x0b, + 0x02, 0x40, 0x20, 0x17, 0x41, 0x7b, 0x6a, 0x41, 0x07, 0x49, 0x0d, 0x00, + 0x03, 0x40, 0x20, 0x2a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x40, 0xa2, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xa2, + 0x21, 0x2a, 0x20, 0x12, 0x41, 0x78, 0x6a, 0x22, 0x12, 0x0d, 0x00, 0x0b, + 0x0b, 0x02, 0x40, 0x20, 0x1e, 0x2d, 0x00, 0x00, 0x41, 0x2d, 0x47, 0x0d, + 0x00, 0x20, 0x2a, 0x20, 0x21, 0x9a, 0x20, 0x2a, 0xa1, 0xa0, 0x9a, 0x21, + 0x21, 0x0c, 0x01, 0x0b, 0x20, 0x21, 0x20, 0x2a, 0xa0, 0x20, 0x2a, 0xa1, + 0x21, 0x21, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x05, 0x28, 0x02, 0x6c, + 0x22, 0x18, 0x45, 0x0d, 0x00, 0x20, 0x18, 0x20, 0x18, 0x41, 0x1f, 0x75, + 0x22, 0x12, 0x73, 0x20, 0x12, 0x6b, 0x21, 0x12, 0x41, 0x00, 0x21, 0x14, + 0x03, 0x40, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, + 0x0b, 0x6a, 0x20, 0x12, 0x20, 0x12, 0x41, 0x0a, 0x6e, 0x22, 0x15, 0x41, + 0x0a, 0x6c, 0x6b, 0x41, 0x30, 0x72, 0x3a, 0x00, 0x00, 0x20, 0x14, 0x41, + 0x7f, 0x6a, 0x21, 0x14, 0x20, 0x12, 0x41, 0x09, 0x4b, 0x21, 0x13, 0x20, + 0x15, 0x21, 0x12, 0x20, 0x13, 0x0d, 0x00, 0x0b, 0x20, 0x14, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x41, 0xc4, 0x00, 0x6a, 0x20, 0x14, 0x6a, 0x41, 0x0c, + 0x6a, 0x21, 0x12, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x30, 0x3a, 0x00, + 0x4f, 0x20, 0x0a, 0x21, 0x12, 0x0b, 0x20, 0x22, 0x41, 0x02, 0x72, 0x21, + 0x1c, 0x20, 0x1d, 0x41, 0x20, 0x71, 0x21, 0x15, 0x20, 0x12, 0x41, 0x7e, + 0x6a, 0x22, 0x1a, 0x20, 0x1d, 0x41, 0x0f, 0x6a, 0x3a, 0x00, 0x00, 0x20, + 0x12, 0x41, 0x7f, 0x6a, 0x41, 0x2d, 0x41, 0x2b, 0x20, 0x18, 0x41, 0x00, + 0x48, 0x1b, 0x3a, 0x00, 0x00, 0x20, 0x16, 0x41, 0x08, 0x71, 0x21, 0x13, + 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x21, 0x14, 0x03, 0x40, 0x20, 0x14, + 0x21, 0x12, 0x02, 0x40, 0x02, 0x40, 0x20, 0x21, 0x99, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x41, 0x63, 0x45, 0x0d, 0x00, 0x20, 0x21, + 0xaa, 0x21, 0x14, 0x0c, 0x01, 0x0b, 0x41, 0x80, 0x80, 0x80, 0x80, 0x78, + 0x21, 0x14, 0x0b, 0x20, 0x12, 0x20, 0x14, 0x41, 0xf0, 0x9d, 0x80, 0x80, + 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x20, 0x15, 0x72, 0x3a, 0x00, 0x00, 0x20, + 0x21, 0x20, 0x14, 0xb7, 0xa1, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x40, 0xa2, 0x21, 0x21, 0x02, 0x40, 0x20, 0x12, 0x41, 0x01, 0x6a, + 0x22, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x6b, 0x41, 0x01, 0x47, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x13, 0x0d, 0x00, 0x20, 0x17, 0x41, 0x00, + 0x4a, 0x0d, 0x00, 0x20, 0x21, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x61, 0x0d, 0x01, 0x0b, 0x20, 0x12, 0x41, 0x2e, 0x3a, 0x00, + 0x01, 0x20, 0x12, 0x41, 0x02, 0x6a, 0x21, 0x14, 0x0b, 0x20, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x0b, + 0x41, 0xfd, 0xff, 0xff, 0xff, 0x07, 0x20, 0x06, 0x20, 0x1a, 0x6b, 0x22, + 0x18, 0x20, 0x1c, 0x6a, 0x22, 0x12, 0x6b, 0x20, 0x17, 0x48, 0x0d, 0x02, + 0x20, 0x17, 0x41, 0x02, 0x6a, 0x20, 0x14, 0x20, 0x05, 0x41, 0xd0, 0x00, + 0x6a, 0x6b, 0x22, 0x14, 0x20, 0x14, 0x41, 0x7e, 0x6a, 0x20, 0x17, 0x48, + 0x1b, 0x20, 0x14, 0x20, 0x17, 0x1b, 0x22, 0x13, 0x20, 0x12, 0x6a, 0x21, + 0x1b, 0x02, 0x40, 0x20, 0x16, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x22, 0x15, + 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, + 0xf0, 0x04, 0x6a, 0x41, 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, + 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x17, 0x1b, + 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x17, 0x0d, + 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, + 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, + 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, + 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, + 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, + 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x1e, 0x20, 0x1c, 0x20, 0x00, + 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x15, + 0x41, 0x80, 0x80, 0x04, 0x47, 0x0d, 0x00, 0x20, 0x19, 0x20, 0x1b, 0x4c, + 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x30, 0x20, 0x19, + 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x17, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, + 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xd0, 0x00, 0x6a, 0x20, 0x14, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, 0x40, 0x20, 0x13, 0x20, 0x14, 0x6b, + 0x22, 0x12, 0x41, 0x01, 0x48, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, + 0x6a, 0x41, 0x30, 0x20, 0x12, 0x41, 0x80, 0x02, 0x20, 0x12, 0x41, 0x80, + 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, + 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, 0x22, 0x12, 0x41, + 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, 0x00, 0x00, + 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x20, + 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x1a, 0x20, 0x18, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, + 0x0b, 0x20, 0x15, 0x41, 0x80, 0xc0, 0x00, 0x47, 0x0d, 0x00, 0x20, 0x19, + 0x20, 0x1b, 0x4c, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, + 0x20, 0x20, 0x19, 0x20, 0x1b, 0x6b, 0x22, 0x12, 0x41, 0x80, 0x02, 0x20, + 0x12, 0x41, 0x80, 0x02, 0x49, 0x22, 0x14, 0x1b, 0x10, 0xc0, 0x80, 0x80, + 0x80, 0x00, 0x1a, 0x02, 0x40, 0x20, 0x14, 0x0d, 0x00, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0xf0, 0x04, 0x6a, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, + 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x12, 0x41, 0x80, 0x7e, 0x6a, + 0x22, 0x12, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x05, 0x41, 0xf0, + 0x04, 0x6a, 0x20, 0x12, 0x20, 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, + 0x1a, 0x0b, 0x20, 0x1b, 0x20, 0x19, 0x20, 0x1b, 0x20, 0x19, 0x4a, 0x1b, + 0x22, 0x12, 0x41, 0x00, 0x4e, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x80, 0xa8, + 0x80, 0x80, 0x00, 0x41, 0x3d, 0x36, 0x02, 0x00, 0x0b, 0x41, 0x7f, 0x21, + 0x11, 0x0b, 0x20, 0x05, 0x41, 0xf0, 0x06, 0x6a, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x11, 0x0b, 0xb3, 0x04, 0x00, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, + 0x41, 0x77, 0x6a, 0x0e, 0x12, 0x11, 0x00, 0x01, 0x04, 0x02, 0x03, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x12, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x34, 0x02, 0x00, 0x37, + 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x35, + 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x34, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, + 0x78, 0x71, 0x22, 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x29, 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x32, 0x01, 0x00, 0x37, 0x03, 0x00, 0x0f, + 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x33, 0x01, 0x00, 0x37, + 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x30, + 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x31, 0x00, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, + 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, + 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, + 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, + 0x03, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, 0x01, 0x41, 0x08, + 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x29, 0x03, 0x00, 0x37, + 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, + 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x34, + 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, + 0x20, 0x01, 0x35, 0x02, 0x00, 0x37, 0x03, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x41, 0x07, 0x6a, 0x41, 0x78, 0x71, 0x22, + 0x01, 0x41, 0x08, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x2b, + 0x03, 0x00, 0x39, 0x03, 0x00, 0x0f, 0x0b, 0x10, 0xbe, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x01, + 0x41, 0x04, 0x6a, 0x36, 0x02, 0x00, 0x20, 0x00, 0x20, 0x01, 0x28, 0x02, + 0x00, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x9e, 0x01, 0x01, 0x01, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x80, 0x02, 0x6b, 0x22, 0x05, 0x24, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x02, 0x20, 0x03, 0x4c, + 0x0d, 0x00, 0x20, 0x04, 0x41, 0x80, 0xc0, 0x04, 0x71, 0x0d, 0x00, 0x20, + 0x05, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x03, 0x41, 0x80, + 0x02, 0x20, 0x03, 0x41, 0x80, 0x02, 0x49, 0x22, 0x04, 0x1b, 0x10, 0xc0, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x02, 0x40, 0x20, 0x04, 0x0d, 0x00, + 0x03, 0x40, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x41, 0x20, 0x71, + 0x0d, 0x00, 0x20, 0x02, 0x41, 0x80, 0x02, 0x20, 0x00, 0x10, 0xb1, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x03, 0x41, 0x80, 0x7e, 0x6a, 0x22, + 0x03, 0x41, 0xff, 0x01, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x41, 0x20, 0x71, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x03, 0x20, + 0x00, 0x10, 0xb1, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x20, 0x05, 0x41, + 0x80, 0x02, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x1c, 0x00, + 0x41, 0x8d, 0x8b, 0x80, 0x80, 0x00, 0x41, 0xf8, 0x9e, 0x80, 0x80, 0x00, + 0x10, 0xb9, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x10, 0xa0, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0xe6, 0x07, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, 0x4b, 0x0d, 0x00, 0x20, 0x01, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x7f, + 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, + 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, + 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, + 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x41, 0x7d, + 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x04, 0x20, 0x01, + 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, + 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, + 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, + 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x0c, + 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, + 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, 0x21, 0x03, 0x20, 0x00, 0x21, 0x04, + 0x20, 0x01, 0x21, 0x05, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, + 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, + 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, 0x6a, 0x22, 0x02, 0x41, 0x10, 0x71, + 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, + 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x05, + 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x49, 0x0d, 0x00, + 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, + 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x08, 0x37, + 0x02, 0x08, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x10, 0x37, 0x02, 0x10, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x18, 0x37, 0x02, 0x18, 0x20, 0x04, + 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x20, 0x6a, 0x21, 0x05, + 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x08, 0x49, 0x0d, 0x00, 0x20, + 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x05, 0x41, + 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, + 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x0b, 0x02, + 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, + 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, + 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x21, 0x05, 0x0b, 0x20, 0x02, + 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x20, 0x49, 0x0d, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x0e, 0x03, + 0x03, 0x00, 0x01, 0x07, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, + 0x3b, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x02, 0x6a, 0x28, 0x01, + 0x00, 0x36, 0x02, 0x02, 0x20, 0x04, 0x20, 0x05, 0x41, 0x06, 0x6a, 0x29, + 0x01, 0x00, 0x37, 0x02, 0x06, 0x20, 0x04, 0x41, 0x12, 0x6a, 0x21, 0x02, + 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, + 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, 0x00, 0x21, 0x05, 0x41, 0x0e, 0x21, + 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x41, 0x01, 0x6a, 0x28, 0x00, 0x00, + 0x36, 0x02, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, + 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x21, 0x02, 0x20, + 0x05, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, 0x05, + 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0f, 0x21, 0x03, + 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, + 0x0d, 0x00, 0x20, 0x04, 0x21, 0x02, 0x20, 0x05, 0x21, 0x01, 0x0c, 0x01, + 0x0b, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, + 0x04, 0x20, 0x05, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, 0x04, 0x20, + 0x05, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, 0x05, 0x2f, + 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x0f, + 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, 0x20, 0x05, + 0x41, 0x10, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x08, 0x71, 0x0d, + 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x22, + 0x02, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x02, 0x41, 0x10, 0x76, 0x3a, + 0x00, 0x02, 0x20, 0x04, 0x20, 0x02, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, + 0x20, 0x04, 0x20, 0x05, 0x41, 0x03, 0x6a, 0x28, 0x00, 0x00, 0x36, 0x02, + 0x03, 0x20, 0x04, 0x20, 0x05, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, 0x37, + 0x02, 0x07, 0x20, 0x04, 0x41, 0x13, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, + 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0f, + 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, 0x41, 0x0d, 0x21, 0x03, 0x0b, 0x20, + 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, + 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, + 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6a, + 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, + 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, + 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x21, + 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, + 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x88, 0x03, 0x02, 0x03, 0x7f, + 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x49, 0x0d, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, 0x0f, 0x0b, + 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x00, 0x20, 0x02, 0x20, 0x00, 0x6a, 0x22, 0x03, 0x41, 0x7f, 0x6a, + 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, + 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, + 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, + 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, + 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, + 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, 0x22, 0x05, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, 0x04, 0x6b, 0x41, 0x7c, 0x71, 0x22, + 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x02, 0x41, + 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x74, 0x6a, + 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x19, 0x49, 0x0d, 0x00, + 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x05, 0x20, 0x03, 0x36, + 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x05, 0x20, + 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, + 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x05, + 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, + 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, + 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x21, 0x02, 0x03, + 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x18, 0x20, 0x02, 0x20, 0x06, + 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x08, 0x20, 0x02, + 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, + 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcc, 0x01, 0x01, 0x03, 0x7f, 0x20, 0x00, + 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x0d, 0x00, 0x20, + 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, + 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x01, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, + 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, + 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, 0x0b, 0x20, 0x01, + 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x7b, 0x6a, 0x21, 0x01, + 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, + 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, 0x7f, 0x73, + 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, + 0x82, 0x84, 0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x03, 0x40, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x21, 0x03, + 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x20, 0x03, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0xf2, 0x02, 0x01, 0x03, 0x7f, + 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x04, + 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x7f, 0x6a, + 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, + 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, + 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x05, 0x41, 0x00, + 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x04, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, + 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, + 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, + 0x00, 0x41, 0x03, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, + 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, + 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, + 0x21, 0x04, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, + 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, + 0x04, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x01, 0x02, 0x40, 0x20, 0x04, 0x2d, + 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x20, + 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, + 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x21, 0x00, 0x03, 0x40, 0x20, 0x04, + 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, + 0x02, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, + 0x84, 0x78, 0x71, 0x0d, 0x02, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, + 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, + 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, + 0x01, 0x71, 0x21, 0x02, 0x03, 0x40, 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, + 0x00, 0x20, 0x02, 0x47, 0x0d, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x04, + 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7f, 0x6a, 0x22, 0x05, + 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x0b, 0x1a, 0x01, 0x01, 0x7f, 0x20, + 0x00, 0x41, 0x00, 0x20, 0x01, 0x10, 0xc2, 0x80, 0x80, 0x80, 0x00, 0x22, + 0x02, 0x20, 0x00, 0x6b, 0x20, 0x01, 0x20, 0x02, 0x1b, 0x0b, 0x37, 0x01, + 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, + 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x20, 0x02, 0x36, + 0x02, 0x0c, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0xba, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x02, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x02, 0x0b, 0x4d, 0x01, 0x01, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x04, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x04, + 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x04, + 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xf8, 0x9e, 0x80, 0x80, + 0x00, 0x41, 0x90, 0x8c, 0x80, 0x80, 0x00, 0x20, 0x04, 0x10, 0xc4, 0x80, + 0x80, 0x80, 0x00, 0x1a, 0x10, 0xa0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x8e, 0x01, 0x01, 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, + 0x10, 0x6b, 0x22, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x41, 0x00, 0x41, + 0x3a, 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x03, + 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x02, 0x36, 0x02, 0x0c, 0x20, 0x04, + 0x20, 0x01, 0x36, 0x02, 0x08, 0x02, 0x40, 0x20, 0x00, 0x20, 0x04, 0x41, + 0x08, 0x6a, 0x41, 0x01, 0x20, 0x03, 0x41, 0xff, 0xff, 0x03, 0x71, 0x20, + 0x04, 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x10, 0x9f, 0x80, + 0x80, 0x80, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x20, 0x03, + 0x36, 0x02, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x41, 0x7f, 0x21, 0x03, 0x0c, + 0x01, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x04, 0x21, 0x03, 0x0b, 0x20, 0x04, + 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x03, 0x0b, + 0x12, 0x00, 0x20, 0x00, 0x41, 0x08, 0x74, 0x20, 0x00, 0x41, 0x08, 0x76, + 0x72, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x23, 0x00, 0x20, 0x00, 0x41, + 0x18, 0x74, 0x20, 0x00, 0x41, 0x80, 0xfe, 0x03, 0x71, 0x41, 0x08, 0x74, + 0x72, 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, 0xfe, 0x03, 0x71, 0x20, + 0x00, 0x41, 0x18, 0x76, 0x72, 0x72, 0x0b, 0xe4, 0x09, 0x11, 0x06, 0x7f, + 0x01, 0x7e, 0x22, 0x7f, 0x01, 0x7e, 0x02, 0x7f, 0x01, 0x7e, 0x04, 0x7f, + 0x01, 0x7e, 0x3e, 0x7f, 0x01, 0x7e, 0x02, 0x7f, 0x01, 0x7e, 0x05, 0x7f, + 0x01, 0x7e, 0x05, 0x7f, 0x01, 0x7e, 0x09, 0x7f, 0x23, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x03, 0x41, 0xe0, 0x00, 0x21, 0x04, 0x20, 0x03, 0x20, + 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x58, 0x20, 0x05, 0x20, 0x01, 0x36, + 0x02, 0x54, 0x20, 0x05, 0x20, 0x02, 0x36, 0x02, 0x50, 0x20, 0x05, 0x28, + 0x02, 0x58, 0x21, 0x06, 0x20, 0x06, 0x28, 0x02, 0x00, 0x21, 0x07, 0x41, + 0x01, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, 0x4b, 0x1a, 0x02, 0x40, 0x02, + 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x07, 0x0e, 0x02, 0x00, + 0x01, 0x02, 0x0b, 0x42, 0x00, 0x21, 0x09, 0x20, 0x05, 0x20, 0x09, 0x37, + 0x03, 0x48, 0x20, 0x05, 0x20, 0x09, 0x37, 0x03, 0x40, 0x20, 0x05, 0x28, + 0x02, 0x58, 0x21, 0x0a, 0x20, 0x0a, 0x2d, 0x00, 0x04, 0x21, 0x0b, 0x41, + 0xff, 0x01, 0x21, 0x0c, 0x20, 0x0b, 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x41, + 0x18, 0x21, 0x0e, 0x20, 0x0d, 0x20, 0x0e, 0x74, 0x21, 0x0f, 0x20, 0x05, + 0x28, 0x02, 0x58, 0x21, 0x10, 0x20, 0x10, 0x2d, 0x00, 0x05, 0x21, 0x11, + 0x41, 0xff, 0x01, 0x21, 0x12, 0x20, 0x11, 0x20, 0x12, 0x71, 0x21, 0x13, + 0x41, 0x10, 0x21, 0x14, 0x20, 0x13, 0x20, 0x14, 0x74, 0x21, 0x15, 0x20, + 0x0f, 0x20, 0x15, 0x72, 0x21, 0x16, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, + 0x17, 0x20, 0x17, 0x2d, 0x00, 0x06, 0x21, 0x18, 0x41, 0xff, 0x01, 0x21, + 0x19, 0x20, 0x18, 0x20, 0x19, 0x71, 0x21, 0x1a, 0x41, 0x08, 0x21, 0x1b, + 0x20, 0x1a, 0x20, 0x1b, 0x74, 0x21, 0x1c, 0x20, 0x16, 0x20, 0x1c, 0x72, + 0x21, 0x1d, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x1e, 0x20, 0x1e, 0x2d, + 0x00, 0x07, 0x21, 0x1f, 0x41, 0xff, 0x01, 0x21, 0x20, 0x20, 0x1f, 0x20, + 0x20, 0x71, 0x21, 0x21, 0x20, 0x1d, 0x20, 0x21, 0x72, 0x21, 0x22, 0x20, + 0x05, 0x20, 0x22, 0x36, 0x02, 0x3c, 0x41, 0x01, 0x21, 0x23, 0x20, 0x05, + 0x20, 0x23, 0x3b, 0x01, 0x40, 0x20, 0x05, 0x28, 0x02, 0x3c, 0x21, 0x24, + 0x20, 0x24, 0x10, 0xa4, 0x80, 0x80, 0x80, 0x00, 0x21, 0x25, 0x20, 0x05, + 0x20, 0x25, 0x36, 0x02, 0x44, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x26, + 0x20, 0x26, 0x2f, 0x01, 0x08, 0x21, 0x27, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x28, 0x20, 0x27, 0x20, 0x28, 0x71, 0x21, 0x29, 0x20, 0x29, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x2a, 0x20, 0x05, 0x20, 0x2a, 0x3b, 0x01, + 0x42, 0x20, 0x05, 0x28, 0x02, 0x54, 0x21, 0x2b, 0x20, 0x05, 0x29, 0x03, + 0x40, 0x21, 0x2c, 0x20, 0x2b, 0x20, 0x2c, 0x37, 0x03, 0x00, 0x41, 0x08, + 0x21, 0x2d, 0x20, 0x2b, 0x20, 0x2d, 0x6a, 0x21, 0x2e, 0x20, 0x05, 0x29, + 0x03, 0x48, 0x21, 0x2f, 0x20, 0x2e, 0x20, 0x2f, 0x37, 0x03, 0x00, 0x20, + 0x05, 0x28, 0x02, 0x50, 0x21, 0x30, 0x41, 0x10, 0x21, 0x31, 0x20, 0x30, + 0x20, 0x31, 0x36, 0x02, 0x00, 0x0c, 0x02, 0x0b, 0x41, 0x28, 0x21, 0x32, + 0x20, 0x05, 0x20, 0x32, 0x6a, 0x21, 0x33, 0x42, 0x00, 0x21, 0x34, 0x20, + 0x33, 0x20, 0x34, 0x37, 0x03, 0x00, 0x41, 0x20, 0x21, 0x35, 0x20, 0x05, + 0x20, 0x35, 0x6a, 0x21, 0x36, 0x20, 0x36, 0x20, 0x34, 0x37, 0x03, 0x00, + 0x20, 0x05, 0x20, 0x34, 0x37, 0x03, 0x18, 0x20, 0x05, 0x20, 0x34, 0x37, + 0x03, 0x10, 0x41, 0x10, 0x21, 0x37, 0x20, 0x05, 0x20, 0x37, 0x6a, 0x21, + 0x38, 0x20, 0x38, 0x21, 0x39, 0x41, 0x08, 0x21, 0x3a, 0x20, 0x39, 0x20, + 0x3a, 0x6a, 0x21, 0x3b, 0x20, 0x05, 0x20, 0x3b, 0x36, 0x02, 0x0c, 0x20, + 0x05, 0x28, 0x02, 0x58, 0x21, 0x3c, 0x20, 0x3c, 0x2f, 0x01, 0x04, 0x21, + 0x3d, 0x41, 0xff, 0xff, 0x03, 0x21, 0x3e, 0x20, 0x3d, 0x20, 0x3e, 0x71, + 0x21, 0x3f, 0x20, 0x3f, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x40, + 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x41, 0x20, 0x41, 0x20, 0x40, 0x3b, + 0x01, 0x00, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x42, 0x20, 0x42, 0x2f, + 0x01, 0x06, 0x21, 0x43, 0x41, 0xff, 0xff, 0x03, 0x21, 0x44, 0x20, 0x43, + 0x20, 0x44, 0x71, 0x21, 0x45, 0x20, 0x45, 0x10, 0xa5, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x46, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x47, 0x20, 0x47, + 0x20, 0x46, 0x3b, 0x01, 0x02, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x48, + 0x20, 0x48, 0x2f, 0x01, 0x08, 0x21, 0x49, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x4a, 0x20, 0x49, 0x20, 0x4a, 0x71, 0x21, 0x4b, 0x20, 0x4b, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x4c, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, + 0x4d, 0x20, 0x4d, 0x20, 0x4c, 0x3b, 0x01, 0x04, 0x20, 0x05, 0x28, 0x02, + 0x58, 0x21, 0x4e, 0x20, 0x4e, 0x2f, 0x01, 0x0a, 0x21, 0x4f, 0x41, 0xff, + 0xff, 0x03, 0x21, 0x50, 0x20, 0x4f, 0x20, 0x50, 0x71, 0x21, 0x51, 0x20, + 0x51, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x52, 0x20, 0x05, 0x28, + 0x02, 0x0c, 0x21, 0x53, 0x20, 0x53, 0x20, 0x52, 0x3b, 0x01, 0x06, 0x20, + 0x05, 0x28, 0x02, 0x58, 0x21, 0x54, 0x20, 0x54, 0x2f, 0x01, 0x0c, 0x21, + 0x55, 0x41, 0xff, 0xff, 0x03, 0x21, 0x56, 0x20, 0x55, 0x20, 0x56, 0x71, + 0x21, 0x57, 0x20, 0x57, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x58, + 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x59, 0x20, 0x59, 0x20, 0x58, 0x3b, + 0x01, 0x08, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x5a, 0x20, 0x5a, 0x2f, + 0x01, 0x0e, 0x21, 0x5b, 0x41, 0xff, 0xff, 0x03, 0x21, 0x5c, 0x20, 0x5b, + 0x20, 0x5c, 0x71, 0x21, 0x5d, 0x20, 0x5d, 0x10, 0xa5, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x5e, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x5f, 0x20, 0x5f, + 0x20, 0x5e, 0x3b, 0x01, 0x0a, 0x20, 0x05, 0x28, 0x02, 0x58, 0x21, 0x60, + 0x20, 0x60, 0x2f, 0x01, 0x10, 0x21, 0x61, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x62, 0x20, 0x61, 0x20, 0x62, 0x71, 0x21, 0x63, 0x20, 0x63, 0x10, 0xa5, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x64, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, + 0x65, 0x20, 0x65, 0x20, 0x64, 0x3b, 0x01, 0x0c, 0x20, 0x05, 0x28, 0x02, + 0x58, 0x21, 0x66, 0x20, 0x66, 0x2f, 0x01, 0x12, 0x21, 0x67, 0x41, 0xff, + 0xff, 0x03, 0x21, 0x68, 0x20, 0x67, 0x20, 0x68, 0x71, 0x21, 0x69, 0x20, + 0x69, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x6a, 0x20, 0x05, 0x28, + 0x02, 0x0c, 0x21, 0x6b, 0x20, 0x6b, 0x20, 0x6a, 0x3b, 0x01, 0x0e, 0x41, + 0x02, 0x21, 0x6c, 0x20, 0x05, 0x20, 0x6c, 0x3b, 0x01, 0x10, 0x20, 0x05, + 0x28, 0x02, 0x58, 0x21, 0x6d, 0x20, 0x6d, 0x2f, 0x01, 0x14, 0x21, 0x6e, + 0x41, 0xff, 0xff, 0x03, 0x21, 0x6f, 0x20, 0x6e, 0x20, 0x6f, 0x71, 0x21, + 0x70, 0x20, 0x70, 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x21, 0x71, 0x20, + 0x05, 0x20, 0x71, 0x3b, 0x01, 0x12, 0x20, 0x05, 0x28, 0x02, 0x54, 0x21, + 0x72, 0x20, 0x05, 0x29, 0x03, 0x10, 0x21, 0x73, 0x20, 0x72, 0x20, 0x73, + 0x37, 0x03, 0x00, 0x41, 0x08, 0x21, 0x74, 0x20, 0x72, 0x20, 0x74, 0x6a, + 0x21, 0x75, 0x20, 0x05, 0x29, 0x03, 0x18, 0x21, 0x76, 0x20, 0x75, 0x20, + 0x76, 0x37, 0x03, 0x00, 0x41, 0x18, 0x21, 0x77, 0x20, 0x72, 0x20, 0x77, + 0x6a, 0x21, 0x78, 0x41, 0x10, 0x21, 0x79, 0x20, 0x05, 0x20, 0x79, 0x6a, + 0x21, 0x7a, 0x20, 0x7a, 0x20, 0x77, 0x6a, 0x21, 0x7b, 0x20, 0x7b, 0x29, + 0x03, 0x00, 0x21, 0x7c, 0x20, 0x78, 0x20, 0x7c, 0x37, 0x03, 0x00, 0x41, + 0x10, 0x21, 0x7d, 0x20, 0x72, 0x20, 0x7d, 0x6a, 0x21, 0x7e, 0x41, 0x10, + 0x21, 0x7f, 0x20, 0x05, 0x20, 0x7f, 0x6a, 0x21, 0x80, 0x01, 0x20, 0x80, + 0x01, 0x20, 0x7d, 0x6a, 0x21, 0x81, 0x01, 0x20, 0x81, 0x01, 0x29, 0x03, + 0x00, 0x21, 0x82, 0x01, 0x20, 0x7e, 0x20, 0x82, 0x01, 0x37, 0x03, 0x00, + 0x20, 0x05, 0x28, 0x02, 0x50, 0x21, 0x83, 0x01, 0x41, 0x20, 0x21, 0x84, + 0x01, 0x20, 0x83, 0x01, 0x20, 0x84, 0x01, 0x36, 0x02, 0x00, 0x0c, 0x01, + 0x0b, 0x41, 0x05, 0x21, 0x85, 0x01, 0x20, 0x05, 0x20, 0x85, 0x01, 0x3b, + 0x01, 0x5e, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x86, 0x01, 0x20, 0x05, + 0x20, 0x86, 0x01, 0x3b, 0x01, 0x5e, 0x0b, 0x20, 0x05, 0x2f, 0x01, 0x5e, + 0x21, 0x87, 0x01, 0x41, 0xff, 0xff, 0x03, 0x21, 0x88, 0x01, 0x20, 0x87, + 0x01, 0x20, 0x88, 0x01, 0x71, 0x21, 0x89, 0x01, 0x41, 0xe0, 0x00, 0x21, + 0x8a, 0x01, 0x20, 0x05, 0x20, 0x8a, 0x01, 0x6a, 0x21, 0x8b, 0x01, 0x20, + 0x8b, 0x01, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x89, 0x01, 0x0f, + 0x0b, 0xac, 0x04, 0x01, 0x43, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x03, 0x41, 0x10, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, + 0x05, 0x20, 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, + 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, + 0x05, 0x20, 0x02, 0x36, 0x02, 0x04, 0x41, 0x00, 0x21, 0x06, 0x20, 0x05, + 0x20, 0x06, 0x3b, 0x01, 0x02, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x07, + 0x20, 0x07, 0x2f, 0x01, 0x00, 0x21, 0x08, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x09, 0x20, 0x08, 0x20, 0x09, 0x71, 0x21, 0x0a, 0x41, 0x01, 0x21, 0x0b, + 0x20, 0x0b, 0x21, 0x0c, 0x20, 0x0a, 0x21, 0x0d, 0x20, 0x0c, 0x20, 0x0d, + 0x46, 0x21, 0x0e, 0x41, 0x01, 0x21, 0x0f, 0x20, 0x0e, 0x20, 0x0f, 0x71, + 0x21, 0x10, 0x02, 0x40, 0x02, 0x40, 0x20, 0x10, 0x45, 0x0d, 0x00, 0x20, + 0x05, 0x28, 0x02, 0x08, 0x21, 0x11, 0x41, 0x10, 0x21, 0x12, 0x20, 0x12, + 0x21, 0x13, 0x20, 0x11, 0x21, 0x14, 0x20, 0x13, 0x20, 0x14, 0x4d, 0x21, + 0x15, 0x41, 0x01, 0x21, 0x16, 0x20, 0x15, 0x20, 0x16, 0x71, 0x21, 0x17, + 0x02, 0x40, 0x20, 0x17, 0x0d, 0x00, 0x41, 0xb6, 0x88, 0x80, 0x80, 0x00, + 0x21, 0x18, 0x41, 0x8b, 0x89, 0x80, 0x80, 0x00, 0x21, 0x19, 0x41, 0xc4, + 0x00, 0x21, 0x1a, 0x41, 0xa0, 0x88, 0x80, 0x80, 0x00, 0x21, 0x1b, 0x20, + 0x18, 0x20, 0x19, 0x20, 0x1a, 0x20, 0x1b, 0x10, 0xc5, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x1c, 0x20, 0x1c, + 0x28, 0x02, 0x04, 0x21, 0x1d, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x1e, + 0x20, 0x1e, 0x2f, 0x01, 0x02, 0x21, 0x1f, 0x20, 0x05, 0x28, 0x02, 0x04, + 0x21, 0x20, 0x41, 0xff, 0xff, 0x03, 0x21, 0x21, 0x20, 0x1f, 0x20, 0x21, + 0x71, 0x21, 0x22, 0x20, 0x1d, 0x20, 0x22, 0x20, 0x20, 0x10, 0xcb, 0x80, + 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, + 0x23, 0x20, 0x23, 0x2f, 0x01, 0x00, 0x21, 0x24, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, 0x71, 0x21, 0x26, 0x41, 0x02, 0x21, + 0x27, 0x20, 0x27, 0x21, 0x28, 0x20, 0x26, 0x21, 0x29, 0x20, 0x28, 0x20, + 0x29, 0x46, 0x21, 0x2a, 0x41, 0x01, 0x21, 0x2b, 0x20, 0x2a, 0x20, 0x2b, + 0x71, 0x21, 0x2c, 0x02, 0x40, 0x02, 0x40, 0x20, 0x2c, 0x45, 0x0d, 0x00, + 0x20, 0x05, 0x28, 0x02, 0x08, 0x21, 0x2d, 0x41, 0x20, 0x21, 0x2e, 0x20, + 0x2e, 0x21, 0x2f, 0x20, 0x2d, 0x21, 0x30, 0x20, 0x2f, 0x20, 0x30, 0x4d, + 0x21, 0x31, 0x41, 0x01, 0x21, 0x32, 0x20, 0x31, 0x20, 0x32, 0x71, 0x21, + 0x33, 0x02, 0x40, 0x20, 0x33, 0x0d, 0x00, 0x41, 0xdc, 0x88, 0x80, 0x80, + 0x00, 0x21, 0x34, 0x41, 0x8b, 0x89, 0x80, 0x80, 0x00, 0x21, 0x35, 0x41, + 0xcb, 0x00, 0x21, 0x36, 0x41, 0xa0, 0x88, 0x80, 0x80, 0x00, 0x21, 0x37, + 0x20, 0x34, 0x20, 0x35, 0x20, 0x36, 0x20, 0x37, 0x10, 0xc5, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x38, 0x41, + 0x08, 0x21, 0x39, 0x20, 0x38, 0x20, 0x39, 0x6a, 0x21, 0x3a, 0x20, 0x05, + 0x28, 0x02, 0x0c, 0x21, 0x3b, 0x20, 0x3b, 0x2f, 0x01, 0x02, 0x21, 0x3c, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x3d, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x3e, 0x20, 0x3c, 0x20, 0x3e, 0x71, 0x21, 0x3f, 0x20, 0x3a, 0x20, 0x3f, + 0x20, 0x3d, 0x10, 0xcc, 0x80, 0x80, 0x80, 0x00, 0x0c, 0x01, 0x0b, 0x41, + 0x05, 0x21, 0x40, 0x20, 0x05, 0x20, 0x40, 0x3b, 0x01, 0x02, 0x0b, 0x0b, + 0x20, 0x05, 0x2f, 0x01, 0x02, 0x21, 0x41, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x42, 0x20, 0x41, 0x20, 0x42, 0x71, 0x21, 0x43, 0x41, 0x10, 0x21, 0x44, + 0x20, 0x05, 0x20, 0x44, 0x6a, 0x21, 0x45, 0x20, 0x45, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x43, 0x0f, 0x0b, 0xa9, 0x01, 0x01, 0x10, 0x7f, + 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x41, 0x10, 0x21, 0x04, + 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x05, + 0x20, 0x01, 0x3b, 0x01, 0x0a, 0x20, 0x05, 0x20, 0x02, 0x36, 0x02, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x06, 0x41, 0x00, 0x21, 0x07, 0x20, + 0x06, 0x20, 0x07, 0x36, 0x02, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x0a, 0x21, + 0x08, 0x41, 0xff, 0xff, 0x03, 0x21, 0x09, 0x20, 0x08, 0x20, 0x09, 0x71, + 0x21, 0x0a, 0x20, 0x0a, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x0c, 0x20, 0x0c, 0x20, 0x0b, 0x3b, + 0x01, 0x08, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x0d, 0x20, 0x05, 0x28, + 0x02, 0x04, 0x21, 0x0e, 0x41, 0x04, 0x21, 0x0f, 0x20, 0x0e, 0x20, 0x0f, + 0x6a, 0x21, 0x10, 0x20, 0x0d, 0x20, 0x10, 0x10, 0xd5, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x10, 0x21, 0x11, 0x20, 0x05, 0x20, 0x11, 0x6a, 0x21, 0x12, + 0x20, 0x12, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0xa9, 0x01, + 0x01, 0x10, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x41, + 0x10, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x0c, 0x20, 0x05, 0x20, 0x01, 0x3b, 0x01, 0x0a, 0x20, 0x05, 0x20, 0x02, + 0x36, 0x02, 0x04, 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x06, 0x41, 0x01, + 0x21, 0x07, 0x20, 0x06, 0x20, 0x07, 0x36, 0x02, 0x00, 0x20, 0x05, 0x2f, + 0x01, 0x0a, 0x21, 0x08, 0x41, 0xff, 0xff, 0x03, 0x21, 0x09, 0x20, 0x08, + 0x20, 0x09, 0x71, 0x21, 0x0a, 0x20, 0x0a, 0x10, 0xc7, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x0c, 0x20, 0x0c, + 0x20, 0x0b, 0x3b, 0x01, 0x14, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x0d, + 0x20, 0x05, 0x28, 0x02, 0x04, 0x21, 0x0e, 0x41, 0x04, 0x21, 0x0f, 0x20, + 0x0e, 0x20, 0x0f, 0x6a, 0x21, 0x10, 0x20, 0x0d, 0x20, 0x10, 0x10, 0xd6, + 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x21, 0x11, 0x20, 0x05, 0x20, 0x11, + 0x6a, 0x21, 0x12, 0x20, 0x12, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0f, + 0x0b, 0xb4, 0x04, 0x05, 0x05, 0x7f, 0x01, 0x7e, 0x1c, 0x7f, 0x01, 0x7e, + 0x17, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x03, 0x41, 0xe0, + 0x00, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x05, + 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, 0x36, 0x02, + 0x58, 0x20, 0x05, 0x20, 0x01, 0x36, 0x02, 0x54, 0x20, 0x05, 0x20, 0x02, + 0x36, 0x02, 0x50, 0x41, 0xc8, 0x00, 0x21, 0x06, 0x20, 0x05, 0x20, 0x06, + 0x6a, 0x21, 0x07, 0x42, 0x00, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, 0x37, + 0x03, 0x00, 0x41, 0xc0, 0x00, 0x21, 0x09, 0x20, 0x05, 0x20, 0x09, 0x6a, + 0x21, 0x0a, 0x20, 0x0a, 0x20, 0x08, 0x37, 0x03, 0x00, 0x20, 0x05, 0x20, + 0x08, 0x37, 0x03, 0x38, 0x20, 0x05, 0x28, 0x02, 0x54, 0x21, 0x0b, 0x41, + 0x00, 0x21, 0x0c, 0x20, 0x0c, 0x21, 0x0d, 0x20, 0x0b, 0x21, 0x0e, 0x20, + 0x0d, 0x20, 0x0e, 0x46, 0x21, 0x0f, 0x41, 0x01, 0x21, 0x10, 0x20, 0x0f, + 0x20, 0x10, 0x71, 0x21, 0x11, 0x02, 0x40, 0x02, 0x40, 0x20, 0x11, 0x45, + 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x12, 0x41, 0x1c, + 0x21, 0x13, 0x20, 0x12, 0x20, 0x13, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, + 0x14, 0x20, 0x05, 0x20, 0x14, 0x36, 0x02, 0x5c, 0x0c, 0x01, 0x0b, 0x20, + 0x05, 0x28, 0x02, 0x54, 0x21, 0x15, 0x20, 0x05, 0x28, 0x02, 0x50, 0x21, + 0x16, 0x41, 0x38, 0x21, 0x17, 0x20, 0x05, 0x20, 0x17, 0x6a, 0x21, 0x18, + 0x20, 0x18, 0x21, 0x19, 0x20, 0x15, 0x20, 0x16, 0x20, 0x19, 0x10, 0xca, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x1a, 0x20, 0x05, 0x20, 0x1a, 0x3b, 0x01, + 0x36, 0x20, 0x05, 0x2f, 0x01, 0x36, 0x21, 0x1b, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x1c, 0x20, 0x1b, 0x20, 0x1c, 0x71, 0x21, 0x1d, 0x02, 0x40, 0x20, + 0x1d, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x36, 0x21, 0x1e, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x1f, 0x20, 0x1e, 0x20, 0x1f, 0x71, 0x21, 0x20, + 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x21, 0x20, 0x21, 0x20, 0x20, + 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x22, 0x20, 0x05, 0x20, 0x22, 0x36, + 0x02, 0x5c, 0x0c, 0x01, 0x0b, 0x41, 0x28, 0x21, 0x23, 0x20, 0x05, 0x20, + 0x23, 0x6a, 0x21, 0x24, 0x42, 0x00, 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, + 0x37, 0x03, 0x00, 0x41, 0x20, 0x21, 0x26, 0x20, 0x05, 0x20, 0x26, 0x6a, + 0x21, 0x27, 0x20, 0x27, 0x20, 0x25, 0x37, 0x03, 0x00, 0x41, 0x18, 0x21, + 0x28, 0x20, 0x05, 0x20, 0x28, 0x6a, 0x21, 0x29, 0x20, 0x29, 0x20, 0x25, + 0x37, 0x03, 0x00, 0x41, 0x10, 0x21, 0x2a, 0x20, 0x05, 0x20, 0x2a, 0x6a, + 0x21, 0x2b, 0x20, 0x2b, 0x20, 0x25, 0x37, 0x03, 0x00, 0x20, 0x05, 0x20, + 0x25, 0x37, 0x03, 0x08, 0x20, 0x05, 0x20, 0x25, 0x37, 0x03, 0x00, 0x20, + 0x05, 0x28, 0x02, 0x58, 0x21, 0x2c, 0x41, 0x38, 0x21, 0x2d, 0x20, 0x05, + 0x20, 0x2d, 0x6a, 0x21, 0x2e, 0x20, 0x2e, 0x21, 0x2f, 0x20, 0x2c, 0x20, + 0x2f, 0x10, 0xce, 0x80, 0x80, 0x80, 0x00, 0x21, 0x30, 0x20, 0x05, 0x20, + 0x30, 0x3b, 0x01, 0x36, 0x20, 0x05, 0x2f, 0x01, 0x36, 0x21, 0x31, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x32, 0x20, 0x31, 0x20, 0x32, 0x71, 0x21, 0x33, + 0x02, 0x40, 0x20, 0x33, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x36, + 0x21, 0x34, 0x41, 0xff, 0xff, 0x03, 0x21, 0x35, 0x20, 0x34, 0x20, 0x35, + 0x71, 0x21, 0x36, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x37, 0x20, + 0x37, 0x20, 0x36, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x38, 0x20, 0x05, + 0x20, 0x38, 0x36, 0x02, 0x5c, 0x0c, 0x01, 0x0b, 0x41, 0x00, 0x21, 0x39, + 0x20, 0x05, 0x20, 0x39, 0x36, 0x02, 0x5c, 0x0b, 0x20, 0x05, 0x28, 0x02, + 0x5c, 0x21, 0x3a, 0x41, 0xe0, 0x00, 0x21, 0x3b, 0x20, 0x05, 0x20, 0x3b, + 0x6a, 0x21, 0x3c, 0x20, 0x3c, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x3a, 0x0f, 0x0b, 0x6a, 0x01, 0x0a, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x02, 0x41, 0x10, 0x21, 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, + 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, + 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x01, 0x36, 0x02, 0x08, + 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x05, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x21, 0x06, 0x20, 0x05, 0x20, 0x06, 0x10, 0x88, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x07, 0x41, 0xff, 0xff, 0x03, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, + 0x71, 0x21, 0x09, 0x41, 0x10, 0x21, 0x0a, 0x20, 0x04, 0x20, 0x0a, 0x6a, + 0x21, 0x0b, 0x20, 0x0b, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x09, + 0x0f, 0x0b, 0x99, 0x04, 0x01, 0x35, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x21, 0x06, 0x41, 0xd0, 0x00, 0x21, 0x07, 0x20, 0x06, 0x20, 0x07, + 0x6b, 0x21, 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, + 0x08, 0x20, 0x00, 0x36, 0x02, 0x48, 0x20, 0x08, 0x20, 0x01, 0x36, 0x02, + 0x44, 0x20, 0x08, 0x20, 0x02, 0x36, 0x02, 0x40, 0x20, 0x08, 0x20, 0x03, + 0x36, 0x02, 0x3c, 0x20, 0x08, 0x20, 0x04, 0x36, 0x02, 0x38, 0x20, 0x08, + 0x20, 0x05, 0x36, 0x02, 0x34, 0x20, 0x08, 0x28, 0x02, 0x44, 0x21, 0x09, + 0x20, 0x08, 0x20, 0x09, 0x36, 0x02, 0x2c, 0x20, 0x08, 0x28, 0x02, 0x40, + 0x21, 0x0a, 0x20, 0x08, 0x20, 0x0a, 0x36, 0x02, 0x30, 0x41, 0x00, 0x21, + 0x0b, 0x20, 0x08, 0x20, 0x0b, 0x36, 0x02, 0x28, 0x41, 0x01, 0x21, 0x0c, + 0x20, 0x08, 0x20, 0x0c, 0x36, 0x02, 0x08, 0x41, 0x00, 0x21, 0x0d, 0x20, + 0x08, 0x20, 0x0d, 0x3b, 0x01, 0x06, 0x20, 0x08, 0x28, 0x02, 0x3c, 0x21, + 0x0e, 0x02, 0x40, 0x02, 0x40, 0x20, 0x0e, 0x45, 0x0d, 0x00, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x0f, 0x41, 0x32, 0x21, 0x10, 0x20, 0x0f, + 0x20, 0x10, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x11, 0x20, 0x08, 0x20, + 0x11, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x38, + 0x21, 0x12, 0x20, 0x08, 0x28, 0x02, 0x34, 0x21, 0x13, 0x41, 0x10, 0x21, + 0x14, 0x20, 0x08, 0x20, 0x14, 0x6a, 0x21, 0x15, 0x20, 0x15, 0x21, 0x16, + 0x20, 0x12, 0x20, 0x13, 0x20, 0x16, 0x10, 0xca, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x17, 0x20, 0x08, 0x20, 0x17, 0x3b, 0x01, 0x0e, 0x20, 0x08, 0x2f, + 0x01, 0x0e, 0x21, 0x18, 0x41, 0xff, 0xff, 0x03, 0x21, 0x19, 0x20, 0x18, + 0x20, 0x19, 0x71, 0x21, 0x1a, 0x02, 0x40, 0x20, 0x1a, 0x45, 0x0d, 0x00, + 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x1b, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x1c, 0x20, 0x1b, 0x20, 0x1c, 0x71, 0x21, 0x1d, 0x41, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x1e, 0x20, 0x1e, 0x20, 0x1d, 0x36, 0x02, 0x00, 0x41, + 0x7f, 0x21, 0x1f, 0x20, 0x08, 0x20, 0x1f, 0x36, 0x02, 0x4c, 0x0c, 0x01, + 0x0b, 0x20, 0x08, 0x28, 0x02, 0x48, 0x21, 0x20, 0x20, 0x08, 0x28, 0x02, + 0x08, 0x21, 0x21, 0x20, 0x08, 0x2f, 0x01, 0x06, 0x21, 0x22, 0x41, 0x2c, + 0x21, 0x23, 0x20, 0x08, 0x20, 0x23, 0x6a, 0x21, 0x24, 0x20, 0x24, 0x21, + 0x25, 0x41, 0x10, 0x21, 0x26, 0x20, 0x08, 0x20, 0x26, 0x6a, 0x21, 0x27, + 0x20, 0x27, 0x21, 0x28, 0x41, 0x28, 0x21, 0x29, 0x20, 0x08, 0x20, 0x29, + 0x6a, 0x21, 0x2a, 0x20, 0x2a, 0x21, 0x2b, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x2c, 0x20, 0x22, 0x20, 0x2c, 0x71, 0x21, 0x2d, 0x20, 0x20, 0x20, 0x25, + 0x20, 0x21, 0x20, 0x2d, 0x20, 0x28, 0x20, 0x2b, 0x10, 0xd0, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x2e, 0x20, 0x08, 0x20, 0x2e, 0x3b, 0x01, 0x0e, 0x20, + 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x2f, 0x41, 0xff, 0xff, 0x03, 0x21, 0x30, + 0x20, 0x2f, 0x20, 0x30, 0x71, 0x21, 0x31, 0x02, 0x40, 0x20, 0x31, 0x45, + 0x0d, 0x00, 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x32, 0x41, 0xff, 0xff, + 0x03, 0x21, 0x33, 0x20, 0x32, 0x20, 0x33, 0x71, 0x21, 0x34, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x35, 0x20, 0x35, 0x20, 0x34, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x21, 0x36, 0x20, 0x08, 0x20, 0x36, 0x36, 0x02, 0x4c, + 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x28, 0x21, 0x37, 0x20, 0x08, + 0x20, 0x37, 0x36, 0x02, 0x4c, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x4c, 0x21, + 0x38, 0x41, 0xd0, 0x00, 0x21, 0x39, 0x20, 0x08, 0x20, 0x39, 0x6a, 0x21, + 0x3a, 0x20, 0x3a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x38, 0x0f, + 0x0b, 0xb7, 0x01, 0x01, 0x10, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x06, 0x41, 0x20, 0x21, 0x07, 0x20, 0x06, 0x20, 0x07, 0x6b, 0x21, + 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x08, 0x20, + 0x00, 0x36, 0x02, 0x1c, 0x20, 0x08, 0x20, 0x01, 0x36, 0x02, 0x18, 0x20, + 0x08, 0x20, 0x02, 0x36, 0x02, 0x14, 0x20, 0x08, 0x20, 0x03, 0x3b, 0x01, + 0x12, 0x20, 0x08, 0x20, 0x04, 0x36, 0x02, 0x0c, 0x20, 0x08, 0x20, 0x05, + 0x36, 0x02, 0x08, 0x20, 0x08, 0x28, 0x02, 0x1c, 0x21, 0x09, 0x20, 0x08, + 0x28, 0x02, 0x18, 0x21, 0x0a, 0x20, 0x08, 0x28, 0x02, 0x14, 0x21, 0x0b, + 0x20, 0x08, 0x2f, 0x01, 0x12, 0x21, 0x0c, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x0d, 0x20, 0x0c, 0x20, 0x0d, 0x71, 0x21, 0x0e, 0x20, 0x08, 0x28, 0x02, + 0x0c, 0x21, 0x0f, 0x20, 0x08, 0x28, 0x02, 0x08, 0x21, 0x10, 0x20, 0x09, + 0x20, 0x0a, 0x20, 0x0b, 0x20, 0x0e, 0x20, 0x0f, 0x20, 0x10, 0x10, 0x89, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x11, 0x41, 0xff, 0xff, 0x03, 0x21, 0x12, + 0x20, 0x11, 0x20, 0x12, 0x71, 0x21, 0x13, 0x41, 0x20, 0x21, 0x14, 0x20, + 0x08, 0x20, 0x14, 0x6a, 0x21, 0x15, 0x20, 0x15, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x20, 0x13, 0x0f, 0x0b, 0xff, 0x05, 0x01, 0x50, 0x7f, 0x23, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x06, 0x41, 0xd0, 0x00, 0x21, 0x07, + 0x20, 0x06, 0x20, 0x07, 0x6b, 0x21, 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x08, 0x20, 0x00, 0x36, 0x02, 0x48, 0x20, 0x08, + 0x20, 0x01, 0x36, 0x02, 0x44, 0x20, 0x08, 0x20, 0x02, 0x36, 0x02, 0x40, + 0x20, 0x08, 0x20, 0x03, 0x36, 0x02, 0x3c, 0x20, 0x08, 0x20, 0x04, 0x36, + 0x02, 0x38, 0x20, 0x08, 0x20, 0x05, 0x36, 0x02, 0x34, 0x20, 0x08, 0x28, + 0x02, 0x44, 0x21, 0x09, 0x20, 0x08, 0x20, 0x09, 0x36, 0x02, 0x2c, 0x20, + 0x08, 0x28, 0x02, 0x40, 0x21, 0x0a, 0x20, 0x08, 0x20, 0x0a, 0x36, 0x02, + 0x30, 0x41, 0x00, 0x21, 0x0b, 0x20, 0x08, 0x20, 0x0b, 0x36, 0x02, 0x28, + 0x41, 0x01, 0x21, 0x0c, 0x20, 0x08, 0x20, 0x0c, 0x36, 0x02, 0x08, 0x41, + 0x00, 0x21, 0x0d, 0x20, 0x08, 0x20, 0x0d, 0x3b, 0x01, 0x06, 0x20, 0x08, + 0x28, 0x02, 0x3c, 0x21, 0x0e, 0x02, 0x40, 0x02, 0x40, 0x20, 0x0e, 0x45, + 0x0d, 0x00, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x0f, 0x41, 0x32, + 0x21, 0x10, 0x20, 0x0f, 0x20, 0x10, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, + 0x11, 0x20, 0x08, 0x20, 0x11, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, 0x20, + 0x08, 0x28, 0x02, 0x38, 0x21, 0x12, 0x41, 0x00, 0x21, 0x13, 0x20, 0x12, + 0x21, 0x14, 0x20, 0x13, 0x21, 0x15, 0x20, 0x14, 0x20, 0x15, 0x47, 0x21, + 0x16, 0x41, 0x01, 0x21, 0x17, 0x20, 0x16, 0x20, 0x17, 0x71, 0x21, 0x18, + 0x02, 0x40, 0x20, 0x18, 0x0d, 0x00, 0x20, 0x08, 0x28, 0x02, 0x48, 0x21, + 0x19, 0x20, 0x08, 0x28, 0x02, 0x44, 0x21, 0x1a, 0x20, 0x08, 0x28, 0x02, + 0x40, 0x21, 0x1b, 0x20, 0x08, 0x28, 0x02, 0x3c, 0x21, 0x1c, 0x20, 0x19, + 0x20, 0x1a, 0x20, 0x1b, 0x20, 0x1c, 0x10, 0xc6, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x1d, 0x20, 0x08, 0x20, 0x1d, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, + 0x20, 0x08, 0x28, 0x02, 0x38, 0x21, 0x1e, 0x20, 0x08, 0x28, 0x02, 0x34, + 0x21, 0x1f, 0x20, 0x1f, 0x28, 0x02, 0x00, 0x21, 0x20, 0x41, 0x10, 0x21, + 0x21, 0x20, 0x08, 0x20, 0x21, 0x6a, 0x21, 0x22, 0x20, 0x22, 0x21, 0x23, + 0x20, 0x1e, 0x20, 0x20, 0x20, 0x23, 0x10, 0xca, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x24, 0x20, 0x08, 0x20, 0x24, 0x3b, 0x01, 0x0e, 0x20, 0x08, 0x2f, + 0x01, 0x0e, 0x21, 0x25, 0x41, 0xff, 0xff, 0x03, 0x21, 0x26, 0x20, 0x25, + 0x20, 0x26, 0x71, 0x21, 0x27, 0x02, 0x40, 0x20, 0x27, 0x45, 0x0d, 0x00, + 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x28, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x29, 0x20, 0x28, 0x20, 0x29, 0x71, 0x21, 0x2a, 0x41, 0x80, 0xa8, 0x80, + 0x80, 0x00, 0x21, 0x2b, 0x20, 0x2b, 0x20, 0x2a, 0x36, 0x02, 0x00, 0x41, + 0x7f, 0x21, 0x2c, 0x20, 0x08, 0x20, 0x2c, 0x36, 0x02, 0x4c, 0x0c, 0x01, + 0x0b, 0x20, 0x08, 0x28, 0x02, 0x48, 0x21, 0x2d, 0x20, 0x08, 0x28, 0x02, + 0x08, 0x21, 0x2e, 0x20, 0x08, 0x2f, 0x01, 0x06, 0x21, 0x2f, 0x41, 0x2c, + 0x21, 0x30, 0x20, 0x08, 0x20, 0x30, 0x6a, 0x21, 0x31, 0x20, 0x31, 0x21, + 0x32, 0x41, 0x10, 0x21, 0x33, 0x20, 0x08, 0x20, 0x33, 0x6a, 0x21, 0x34, + 0x20, 0x34, 0x21, 0x35, 0x41, 0x28, 0x21, 0x36, 0x20, 0x08, 0x20, 0x36, + 0x6a, 0x21, 0x37, 0x20, 0x37, 0x21, 0x38, 0x41, 0xff, 0xff, 0x03, 0x21, + 0x39, 0x20, 0x2f, 0x20, 0x39, 0x71, 0x21, 0x3a, 0x20, 0x2d, 0x20, 0x32, + 0x20, 0x2e, 0x20, 0x3a, 0x20, 0x35, 0x20, 0x38, 0x10, 0xd2, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x3b, 0x20, 0x08, 0x20, 0x3b, 0x3b, 0x01, 0x0e, 0x20, + 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x3c, 0x41, 0xff, 0xff, 0x03, 0x21, 0x3d, + 0x20, 0x3c, 0x20, 0x3d, 0x71, 0x21, 0x3e, 0x02, 0x40, 0x20, 0x3e, 0x45, + 0x0d, 0x00, 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x3f, 0x41, 0xff, 0xff, + 0x03, 0x21, 0x40, 0x20, 0x3f, 0x20, 0x40, 0x71, 0x21, 0x41, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x42, 0x20, 0x42, 0x20, 0x41, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x21, 0x43, 0x20, 0x08, 0x20, 0x43, 0x36, 0x02, 0x4c, + 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, 0x02, 0x38, 0x21, 0x44, 0x20, 0x08, + 0x28, 0x02, 0x34, 0x21, 0x45, 0x41, 0x10, 0x21, 0x46, 0x20, 0x08, 0x20, + 0x46, 0x6a, 0x21, 0x47, 0x20, 0x47, 0x21, 0x48, 0x20, 0x48, 0x20, 0x44, + 0x20, 0x45, 0x10, 0xc9, 0x80, 0x80, 0x80, 0x00, 0x21, 0x49, 0x20, 0x08, + 0x20, 0x49, 0x3b, 0x01, 0x0e, 0x20, 0x08, 0x2f, 0x01, 0x0e, 0x21, 0x4a, + 0x41, 0xff, 0xff, 0x03, 0x21, 0x4b, 0x20, 0x4a, 0x20, 0x4b, 0x71, 0x21, + 0x4c, 0x02, 0x40, 0x20, 0x4c, 0x45, 0x0d, 0x00, 0x20, 0x08, 0x2f, 0x01, + 0x0e, 0x21, 0x4d, 0x41, 0xff, 0xff, 0x03, 0x21, 0x4e, 0x20, 0x4d, 0x20, + 0x4e, 0x71, 0x21, 0x4f, 0x41, 0x80, 0xa8, 0x80, 0x80, 0x00, 0x21, 0x50, + 0x20, 0x50, 0x20, 0x4f, 0x36, 0x02, 0x00, 0x41, 0x7f, 0x21, 0x51, 0x20, + 0x08, 0x20, 0x51, 0x36, 0x02, 0x4c, 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x28, + 0x02, 0x28, 0x21, 0x52, 0x20, 0x08, 0x20, 0x52, 0x36, 0x02, 0x4c, 0x0b, + 0x20, 0x08, 0x28, 0x02, 0x4c, 0x21, 0x53, 0x41, 0xd0, 0x00, 0x21, 0x54, + 0x20, 0x08, 0x20, 0x54, 0x6a, 0x21, 0x55, 0x20, 0x55, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x53, 0x0f, 0x0b, 0xb7, 0x01, 0x01, 0x10, 0x7f, + 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x06, 0x41, 0x20, 0x21, 0x07, + 0x20, 0x06, 0x20, 0x07, 0x6b, 0x21, 0x08, 0x20, 0x08, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x20, 0x08, 0x20, 0x00, 0x36, 0x02, 0x1c, 0x20, 0x08, + 0x20, 0x01, 0x36, 0x02, 0x18, 0x20, 0x08, 0x20, 0x02, 0x36, 0x02, 0x14, + 0x20, 0x08, 0x20, 0x03, 0x3b, 0x01, 0x12, 0x20, 0x08, 0x20, 0x04, 0x36, + 0x02, 0x0c, 0x20, 0x08, 0x20, 0x05, 0x36, 0x02, 0x08, 0x20, 0x08, 0x28, + 0x02, 0x1c, 0x21, 0x09, 0x20, 0x08, 0x28, 0x02, 0x18, 0x21, 0x0a, 0x20, + 0x08, 0x28, 0x02, 0x14, 0x21, 0x0b, 0x20, 0x08, 0x2f, 0x01, 0x12, 0x21, + 0x0c, 0x41, 0xff, 0xff, 0x03, 0x21, 0x0d, 0x20, 0x0c, 0x20, 0x0d, 0x71, + 0x21, 0x0e, 0x20, 0x08, 0x28, 0x02, 0x0c, 0x21, 0x0f, 0x20, 0x08, 0x28, + 0x02, 0x08, 0x21, 0x10, 0x20, 0x09, 0x20, 0x0a, 0x20, 0x0b, 0x20, 0x0e, + 0x20, 0x0f, 0x20, 0x10, 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x21, 0x11, + 0x41, 0xff, 0xff, 0x03, 0x21, 0x12, 0x20, 0x11, 0x20, 0x12, 0x71, 0x21, + 0x13, 0x41, 0x20, 0x21, 0x14, 0x20, 0x08, 0x20, 0x14, 0x6a, 0x21, 0x15, + 0x20, 0x15, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x13, 0x0f, 0x0b, + 0x82, 0x04, 0x01, 0x39, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x03, 0x41, 0x30, 0x21, 0x04, 0x20, 0x03, 0x20, 0x04, 0x6b, 0x21, 0x05, + 0x20, 0x05, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x05, 0x20, 0x00, + 0x36, 0x02, 0x28, 0x20, 0x05, 0x20, 0x01, 0x36, 0x02, 0x24, 0x20, 0x05, + 0x20, 0x02, 0x36, 0x02, 0x20, 0x41, 0x7f, 0x21, 0x06, 0x20, 0x05, 0x20, + 0x06, 0x36, 0x02, 0x1c, 0x20, 0x05, 0x28, 0x02, 0x28, 0x21, 0x07, 0x41, + 0x01, 0x21, 0x08, 0x20, 0x08, 0x21, 0x09, 0x20, 0x07, 0x21, 0x0a, 0x20, + 0x09, 0x20, 0x0a, 0x46, 0x21, 0x0b, 0x41, 0x01, 0x21, 0x0c, 0x20, 0x0b, + 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x0d, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x0e, 0x20, 0x05, 0x20, 0x0e, + 0x36, 0x02, 0x10, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x28, 0x21, + 0x0f, 0x41, 0x02, 0x21, 0x10, 0x20, 0x10, 0x21, 0x11, 0x20, 0x0f, 0x21, + 0x12, 0x20, 0x11, 0x20, 0x12, 0x46, 0x21, 0x13, 0x41, 0x01, 0x21, 0x14, + 0x20, 0x13, 0x20, 0x14, 0x71, 0x21, 0x15, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x15, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x16, 0x20, 0x05, 0x20, 0x16, + 0x36, 0x02, 0x10, 0x0c, 0x01, 0x0b, 0x41, 0x32, 0x21, 0x17, 0x20, 0x05, + 0x20, 0x17, 0x36, 0x02, 0x2c, 0x0c, 0x02, 0x0b, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x24, 0x21, 0x18, 0x41, 0x05, 0x21, 0x19, 0x20, 0x19, 0x21, 0x1a, + 0x20, 0x18, 0x21, 0x1b, 0x20, 0x1a, 0x20, 0x1b, 0x46, 0x21, 0x1c, 0x41, + 0x01, 0x21, 0x1d, 0x20, 0x1c, 0x20, 0x1d, 0x71, 0x21, 0x1e, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x1e, 0x45, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x1f, 0x20, + 0x05, 0x20, 0x1f, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, + 0x02, 0x24, 0x21, 0x20, 0x41, 0x06, 0x21, 0x21, 0x20, 0x21, 0x21, 0x22, + 0x20, 0x20, 0x21, 0x23, 0x20, 0x22, 0x20, 0x23, 0x46, 0x21, 0x24, 0x41, + 0x01, 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, 0x71, 0x21, 0x26, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x26, 0x45, 0x0d, 0x00, 0x41, 0x01, 0x21, 0x27, 0x20, + 0x05, 0x20, 0x27, 0x36, 0x02, 0x0c, 0x0c, 0x01, 0x0b, 0x41, 0x32, 0x21, + 0x28, 0x20, 0x05, 0x20, 0x28, 0x36, 0x02, 0x2c, 0x0c, 0x02, 0x0b, 0x0b, + 0x20, 0x05, 0x28, 0x02, 0x1c, 0x21, 0x29, 0x20, 0x05, 0x28, 0x02, 0x10, + 0x21, 0x2a, 0x20, 0x05, 0x28, 0x02, 0x0c, 0x21, 0x2b, 0x41, 0x18, 0x21, + 0x2c, 0x20, 0x05, 0x20, 0x2c, 0x6a, 0x21, 0x2d, 0x20, 0x2d, 0x21, 0x2e, + 0x20, 0x29, 0x20, 0x2a, 0x20, 0x2b, 0x20, 0x2e, 0x10, 0xd4, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x2f, 0x20, 0x05, 0x20, 0x2f, 0x3b, 0x01, 0x16, 0x20, + 0x05, 0x2f, 0x01, 0x16, 0x21, 0x30, 0x41, 0xff, 0xff, 0x03, 0x21, 0x31, + 0x20, 0x30, 0x20, 0x31, 0x71, 0x21, 0x32, 0x02, 0x40, 0x20, 0x32, 0x45, + 0x0d, 0x00, 0x20, 0x05, 0x2f, 0x01, 0x16, 0x21, 0x33, 0x41, 0xff, 0xff, + 0x03, 0x21, 0x34, 0x20, 0x33, 0x20, 0x34, 0x71, 0x21, 0x35, 0x41, 0x80, + 0xa8, 0x80, 0x80, 0x00, 0x21, 0x36, 0x20, 0x36, 0x20, 0x35, 0x36, 0x02, + 0x00, 0x41, 0x7f, 0x21, 0x37, 0x20, 0x05, 0x20, 0x37, 0x36, 0x02, 0x2c, + 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x18, 0x21, 0x38, 0x20, 0x05, + 0x20, 0x38, 0x36, 0x02, 0x2c, 0x0b, 0x20, 0x05, 0x28, 0x02, 0x2c, 0x21, + 0x39, 0x41, 0x30, 0x21, 0x3a, 0x20, 0x05, 0x20, 0x3a, 0x6a, 0x21, 0x3b, + 0x20, 0x3b, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x39, 0x0f, 0x0b, + 0x8a, 0x01, 0x01, 0x0c, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x04, 0x41, 0x10, 0x21, 0x05, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x06, + 0x20, 0x06, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x06, 0x20, 0x00, + 0x36, 0x02, 0x0c, 0x20, 0x06, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x06, + 0x20, 0x02, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x03, 0x36, 0x02, 0x00, + 0x20, 0x06, 0x28, 0x02, 0x0c, 0x21, 0x07, 0x20, 0x06, 0x28, 0x02, 0x08, + 0x21, 0x08, 0x20, 0x06, 0x28, 0x02, 0x04, 0x21, 0x09, 0x20, 0x06, 0x28, + 0x02, 0x00, 0x21, 0x0a, 0x20, 0x07, 0x20, 0x08, 0x20, 0x09, 0x20, 0x0a, + 0x10, 0x8b, 0x80, 0x80, 0x80, 0x00, 0x21, 0x0b, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x0c, 0x20, 0x0b, 0x20, 0x0c, 0x71, 0x21, 0x0d, 0x41, 0x10, 0x21, + 0x0e, 0x20, 0x06, 0x20, 0x0e, 0x6a, 0x21, 0x0f, 0x20, 0x0f, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x0d, 0x0f, 0x0b, 0x83, 0x02, 0x01, 0x1d, + 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, 0x10, 0x21, + 0x03, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, + 0x04, 0x20, 0x01, 0x36, 0x02, 0x08, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x05, 0x20, 0x05, 0x10, 0xc8, 0x80, 0x80, 0x80, 0x00, 0x21, 0x06, 0x20, + 0x04, 0x20, 0x06, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x07, 0x41, 0x80, 0x80, 0x80, 0x78, 0x21, 0x08, 0x20, 0x07, 0x20, 0x08, + 0x71, 0x21, 0x09, 0x41, 0x18, 0x21, 0x0a, 0x20, 0x09, 0x20, 0x0a, 0x76, + 0x21, 0x0b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x0c, 0x20, 0x0c, 0x20, + 0x0b, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x0d, 0x41, + 0x80, 0x80, 0xfc, 0x07, 0x21, 0x0e, 0x20, 0x0d, 0x20, 0x0e, 0x71, 0x21, + 0x0f, 0x41, 0x10, 0x21, 0x10, 0x20, 0x0f, 0x20, 0x10, 0x76, 0x21, 0x11, + 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x12, 0x20, 0x12, 0x20, 0x11, 0x3a, + 0x00, 0x01, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x13, 0x41, 0x80, 0xfe, + 0x03, 0x21, 0x14, 0x20, 0x13, 0x20, 0x14, 0x71, 0x21, 0x15, 0x41, 0x08, + 0x21, 0x16, 0x20, 0x15, 0x20, 0x16, 0x76, 0x21, 0x17, 0x20, 0x04, 0x28, + 0x02, 0x08, 0x21, 0x18, 0x20, 0x18, 0x20, 0x17, 0x3a, 0x00, 0x02, 0x20, + 0x04, 0x28, 0x02, 0x0c, 0x21, 0x19, 0x41, 0xff, 0x01, 0x21, 0x1a, 0x20, + 0x19, 0x20, 0x1a, 0x71, 0x21, 0x1b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, + 0x1c, 0x20, 0x1c, 0x20, 0x1b, 0x3a, 0x00, 0x03, 0x41, 0x10, 0x21, 0x1d, + 0x20, 0x04, 0x20, 0x1d, 0x6a, 0x21, 0x1e, 0x20, 0x1e, 0x24, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x0f, 0x0b, 0xd9, 0x03, 0x01, 0x35, 0x7f, 0x23, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x21, 0x02, 0x41, 0x10, 0x21, 0x03, 0x20, 0x02, + 0x20, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x04, 0x24, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x04, 0x20, 0x00, 0x36, 0x02, 0x0c, 0x20, 0x04, 0x20, 0x01, + 0x36, 0x02, 0x08, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x05, 0x20, 0x05, + 0x2f, 0x01, 0x00, 0x21, 0x06, 0x41, 0xff, 0xff, 0x03, 0x21, 0x07, 0x20, + 0x06, 0x20, 0x07, 0x71, 0x21, 0x08, 0x20, 0x08, 0x10, 0xc7, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x09, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x0a, 0x20, + 0x0a, 0x20, 0x09, 0x3b, 0x01, 0x00, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x0b, 0x20, 0x0b, 0x2f, 0x01, 0x02, 0x21, 0x0c, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x0d, 0x20, 0x0c, 0x20, 0x0d, 0x71, 0x21, 0x0e, 0x20, 0x0e, 0x10, + 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x0f, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x21, 0x10, 0x20, 0x10, 0x20, 0x0f, 0x3b, 0x01, 0x02, 0x20, 0x04, 0x28, + 0x02, 0x0c, 0x21, 0x11, 0x20, 0x11, 0x2f, 0x01, 0x04, 0x21, 0x12, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x13, 0x20, 0x12, 0x20, 0x13, 0x71, 0x21, 0x14, + 0x20, 0x14, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x15, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x21, 0x16, 0x20, 0x16, 0x20, 0x15, 0x3b, 0x01, 0x04, + 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x17, 0x20, 0x17, 0x2f, 0x01, 0x06, + 0x21, 0x18, 0x41, 0xff, 0xff, 0x03, 0x21, 0x19, 0x20, 0x18, 0x20, 0x19, + 0x71, 0x21, 0x1a, 0x20, 0x1a, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x1b, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x1c, 0x20, 0x1c, 0x20, 0x1b, + 0x3b, 0x01, 0x06, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x1d, 0x20, 0x1d, + 0x2f, 0x01, 0x08, 0x21, 0x1e, 0x41, 0xff, 0xff, 0x03, 0x21, 0x1f, 0x20, + 0x1e, 0x20, 0x1f, 0x71, 0x21, 0x20, 0x20, 0x20, 0x10, 0xc7, 0x80, 0x80, + 0x80, 0x00, 0x21, 0x21, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x22, 0x20, + 0x22, 0x20, 0x21, 0x3b, 0x01, 0x08, 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, + 0x23, 0x20, 0x23, 0x2f, 0x01, 0x0a, 0x21, 0x24, 0x41, 0xff, 0xff, 0x03, + 0x21, 0x25, 0x20, 0x24, 0x20, 0x25, 0x71, 0x21, 0x26, 0x20, 0x26, 0x10, + 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x27, 0x20, 0x04, 0x28, 0x02, 0x08, + 0x21, 0x28, 0x20, 0x28, 0x20, 0x27, 0x3b, 0x01, 0x0a, 0x20, 0x04, 0x28, + 0x02, 0x0c, 0x21, 0x29, 0x20, 0x29, 0x2f, 0x01, 0x0c, 0x21, 0x2a, 0x41, + 0xff, 0xff, 0x03, 0x21, 0x2b, 0x20, 0x2a, 0x20, 0x2b, 0x71, 0x21, 0x2c, + 0x20, 0x2c, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, 0x2d, 0x20, 0x04, + 0x28, 0x02, 0x08, 0x21, 0x2e, 0x20, 0x2e, 0x20, 0x2d, 0x3b, 0x01, 0x0c, + 0x20, 0x04, 0x28, 0x02, 0x0c, 0x21, 0x2f, 0x20, 0x2f, 0x2f, 0x01, 0x0e, + 0x21, 0x30, 0x41, 0xff, 0xff, 0x03, 0x21, 0x31, 0x20, 0x30, 0x20, 0x31, + 0x71, 0x21, 0x32, 0x20, 0x32, 0x10, 0xc7, 0x80, 0x80, 0x80, 0x00, 0x21, + 0x33, 0x20, 0x04, 0x28, 0x02, 0x08, 0x21, 0x34, 0x20, 0x34, 0x20, 0x33, + 0x3b, 0x01, 0x0e, 0x41, 0x10, 0x21, 0x35, 0x20, 0x04, 0x20, 0x35, 0x6a, + 0x21, 0x36, 0x20, 0x36, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0f, 0x0b, + 0x0b, 0xfb, 0x17, 0x02, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x80, 0x16, 0x2d, + 0x2b, 0x20, 0x20, 0x20, 0x30, 0x58, 0x30, 0x78, 0x00, 0x2d, 0x30, 0x58, + 0x2b, 0x30, 0x58, 0x20, 0x30, 0x58, 0x2d, 0x30, 0x78, 0x2b, 0x30, 0x78, + 0x20, 0x30, 0x78, 0x00, 0x25, 0x73, 0x00, 0x73, 0x6f, 0x63, 0x6b, 0x61, + 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x00, 0x73, 0x69, 0x7a, 0x65, 0x6f, 0x66, 0x28, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x61, + 0x64, 0x64, 0x72, 0x5f, 0x69, 0x6e, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x73, 0x69, 0x7a, 0x65, 0x6f, + 0x66, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x73, 0x6f, 0x63, + 0x6b, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x69, 0x6e, 0x36, 0x29, 0x20, 0x3c, + 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x6c, 0x65, 0x6e, 0x00, 0x6e, 0x61, + 0x6e, 0x00, 0x69, 0x6e, 0x66, 0x00, 0x69, 0x6e, 0x63, 0x2f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x78, + 0x74, 0x2e, 0x63, 0x00, 0x4e, 0x41, 0x4e, 0x00, 0x49, 0x4e, 0x46, 0x00, + 0x2e, 0x00, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x00, 0x5b, 0x77, 0x61, + 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x30, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x00, 0x5b, + 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x64, 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, + 0x6f, 0x64, 0x5d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x25, 0x64, + 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, + 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x72, 0x63, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, + 0x64, 0x5d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x63, 0x20, 0x3d, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x5b, 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, + 0x6f, 0x64, 0x5d, 0x20, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x47, 0x45, 0x54, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, + 0x32, 0x2e, 0x31, 0x30, 0x3a, 0x38, 0x30, 0x30, 0x30, 0x2f, 0x0a, 0x00, + 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6c, + 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x2e, 0x0a, 0x54, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x2d, + 0x6c, 0x63, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x63, 0x61, 0x6e, + 0x2d, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x00, 0x41, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x3a, 0x20, 0x25, 0x73, 0x20, 0x28, 0x25, 0x73, 0x3a, + 0x20, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x64, 0x29, 0x0a, 0x00, 0x47, 0x45, + 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, + 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x31, 0x39, 0x32, 0x2e, + 0x30, 0x2e, 0x32, 0x2e, 0x31, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x00, 0x5b, + 0x77, 0x61, 0x73, 0x6d, 0x2d, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x0a, 0x0a, 0x00, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, + 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x00, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x00, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, + 0x74, 0x74, 0x79, 0x00, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x00, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, + 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x00, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, + 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x00, 0x4e, 0x6f, + 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, + 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x4f, 0x75, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x00, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x62, 0x75, 0x73, + 0x79, 0x00, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, + 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x20, 0x75, + 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x65, 0x65, 0x6b, 0x00, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x2d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x00, 0x52, 0x65, 0x61, 0x64, 0x2d, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x00, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x00, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x70, 0x65, 0x65, 0x72, + 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, 0x75, + 0x73, 0x65, 0x64, 0x00, 0x48, 0x6f, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x00, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, + 0x73, 0x65, 0x00, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x69, + 0x70, 0x65, 0x00, 0x49, 0x2f, 0x4f, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x00, 0x49, 0x73, + 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x00, 0x54, 0x65, 0x78, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x62, + 0x75, 0x73, 0x79, 0x00, 0x45, 0x78, 0x65, 0x63, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x49, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x00, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x6f, 0x6e, + 0x67, 0x00, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x00, 0x46, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x6f, + 0x6e, 0x67, 0x00, 0x54, 0x6f, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, + 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x4e, 0x6f, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x00, 0x42, 0x61, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x00, 0x4e, + 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x00, 0x42, 0x61, 0x64, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x00, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6f, + 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, 0x54, 0x6f, 0x6f, 0x20, 0x6d, + 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x00, 0x4e, 0x6f, + 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x00, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x77, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x00, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x20, + 0x64, 0x69, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x00, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, + 0x00, 0x4e, 0x6f, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x00, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x00, 0x4c, + 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, + 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x65, 0x64, 0x00, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x42, 0x61, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x00, + 0x4e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x00, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x77, 0x72, 0x6f, + 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x00, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x77, + 0x6e, 0x00, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x75, 0x6e, + 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x4e, 0x6f, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x53, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x53, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x00, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x53, 0x74, 0x61, 0x6c, + 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x00, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x65, 0x64, 0x65, 0x64, 0x00, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x68, 0x6f, + 0x70, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x00, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, + 0x74, 0x00, 0x00, 0x00, 0x00, 0x75, 0x02, 0x4e, 0x00, 0xd6, 0x01, 0xe2, + 0x04, 0xb9, 0x04, 0x18, 0x01, 0x8e, 0x05, 0xed, 0x02, 0x16, 0x04, 0xf2, + 0x00, 0x97, 0x03, 0x01, 0x03, 0x38, 0x05, 0xaf, 0x01, 0x82, 0x01, 0x4f, + 0x03, 0x2f, 0x04, 0x1e, 0x00, 0xd4, 0x05, 0xa2, 0x00, 0x12, 0x03, 0x1e, + 0x03, 0xc2, 0x01, 0xde, 0x03, 0x08, 0x00, 0xac, 0x05, 0x00, 0x01, 0x64, + 0x02, 0xf1, 0x01, 0x65, 0x05, 0x34, 0x02, 0x8c, 0x02, 0xcf, 0x02, 0x2d, + 0x03, 0x4c, 0x04, 0xe3, 0x05, 0x9f, 0x02, 0xf8, 0x04, 0x1c, 0x05, 0x08, + 0x05, 0xb1, 0x02, 0x4b, 0x05, 0x15, 0x02, 0x78, 0x00, 0x52, 0x02, 0x3c, + 0x03, 0xf1, 0x03, 0xe4, 0x00, 0xc3, 0x03, 0x7d, 0x04, 0xcc, 0x00, 0xaa, + 0x03, 0x79, 0x05, 0x24, 0x02, 0x6e, 0x01, 0x6d, 0x03, 0x22, 0x04, 0xab, + 0x04, 0x44, 0x00, 0xfb, 0x01, 0xae, 0x00, 0x83, 0x03, 0x60, 0x00, 0xe5, + 0x01, 0x07, 0x04, 0x94, 0x04, 0x5e, 0x04, 0x2b, 0x00, 0x58, 0x01, 0x39, + 0x01, 0x92, 0x00, 0xc2, 0x05, 0x9b, 0x01, 0x43, 0x02, 0x46, 0x01, 0xf6, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x0a, 0x00, 0x19, + 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x11, 0x0a, 0x19, 0x19, 0x19, 0x03, 0x0a, + 0x07, 0x00, 0x01, 0x1b, 0x09, 0x0b, 0x18, 0x00, 0x00, 0x09, 0x06, 0x0b, + 0x00, 0x00, 0x0b, 0x00, 0x06, 0x19, 0x00, 0x00, 0x00, 0x19, 0x19, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x0a, 0x0d, 0x19, 0x19, 0x19, 0x00, 0x0d, 0x00, 0x00, + 0x02, 0x00, 0x09, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x00, + 0x0e, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x04, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x09, 0x12, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x1a, 0x00, 0x00, + 0x00, 0x1a, 0x1a, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x09, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x41, 0x80, 0x1e, 0x0b, + 0xec, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x16, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 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, 0x78, 0x0f, 0x00, 0x00, 0x00, 0xbb, + 0x0c, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x01, 0xeb, 0x0b, 0x57, 0x00, 0x2a, + 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, + 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2a, 0x5f, 0x5f, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x03, 0x2f, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x67, 0x65, 0x74, 0x04, 0x29, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, + 0x05, 0x2a, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, + 0x66, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x06, 0x2b, 0x5f, 0x5f, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, + 0x5f, 0x65, 0x78, 0x69, 0x74, 0x07, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, + 0x63, 0x76, 0x08, 0x2e, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x09, 0x2e, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, + 0x74, 0x6f, 0x0a, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, + 0x66, 0x72, 0x6f, 0x6d, 0x0b, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x0c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x0d, 0x06, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x0e, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x0f, 0x06, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x10, 0x08, 0x64, 0x6c, 0x6d, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x11, 0x04, 0x66, 0x72, 0x65, 0x65, 0x12, 0x06, + 0x64, 0x6c, 0x66, 0x72, 0x65, 0x65, 0x13, 0x06, 0x63, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x14, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x15, 0x0b, 0x5f, + 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, 0x64, 0x16, 0x1c, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x70, + 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x6f, + 0x70, 0x65, 0x6e, 0x73, 0x17, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, + 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x19, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, + 0x67, 0x65, 0x74, 0x1a, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x66, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x1b, 0x14, 0x5f, 0x5f, + 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x66, 0x64, 0x73, 0x74, + 0x61, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x1c, 0x0e, 0x5f, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x1d, 0x0f, + 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x66, 0x64, 0x5f, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x1e, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x1f, 0x10, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x72, + 0x65, 0x63, 0x76, 0x20, 0x05, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x21, 0x04, + 0x73, 0x62, 0x72, 0x6b, 0x22, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x23, + 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x64, 0x74, 0x6f, 0x72, 0x73, 0x24, 0x05, 0x68, 0x74, 0x6f, 0x6e, + 0x6c, 0x25, 0x05, 0x68, 0x74, 0x6f, 0x6e, 0x73, 0x26, 0x06, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x66, 0x27, 0x0d, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, + 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x06, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x76, 0x29, 0x0d, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6f, + 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2a, 0x08, 0x5f, 0x5f, 0x69, 0x73, + 0x61, 0x74, 0x74, 0x79, 0x2b, 0x0e, 0x5f, 0x5f, 0x73, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, 0x07, 0x5f, 0x5f, + 0x6c, 0x73, 0x65, 0x65, 0x6b, 0x2d, 0x0c, 0x5f, 0x5f, 0x73, 0x74, 0x64, + 0x69, 0x6f, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x2e, 0x0a, 0x5f, 0x5f, 0x6f, + 0x66, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x0c, 0x5f, 0x5f, 0x73, + 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x30, 0x09, 0x5f, + 0x5f, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x31, 0x09, 0x5f, 0x5f, + 0x66, 0x77, 0x72, 0x69, 0x74, 0x65, 0x78, 0x32, 0x06, 0x66, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x33, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x34, 0x09, + 0x5f, 0x5f, 0x6c, 0x63, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x35, 0x08, 0x73, + 0x74, 0x72, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x36, 0x07, 0x77, 0x63, 0x72, + 0x74, 0x6f, 0x6d, 0x62, 0x37, 0x06, 0x77, 0x63, 0x74, 0x6f, 0x6d, 0x62, + 0x38, 0x05, 0x66, 0x72, 0x65, 0x78, 0x70, 0x39, 0x05, 0x66, 0x70, 0x75, + 0x74, 0x73, 0x3a, 0x08, 0x76, 0x66, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, + 0x3b, 0x0b, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x3c, 0x07, 0x70, 0x6f, 0x70, 0x5f, 0x61, 0x72, 0x67, 0x3d, 0x03, + 0x70, 0x61, 0x64, 0x3e, 0x19, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x64, 0x6f, + 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x3f, 0x06, 0x6d, 0x65, 0x6d, 0x63, + 0x70, 0x79, 0x40, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x41, 0x06, + 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x42, 0x06, 0x6d, 0x65, 0x6d, 0x63, + 0x68, 0x72, 0x43, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x44, + 0x07, 0x66, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x45, 0x0d, 0x5f, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x46, + 0x04, 0x72, 0x65, 0x63, 0x76, 0x47, 0x05, 0x6e, 0x74, 0x6f, 0x68, 0x73, + 0x48, 0x05, 0x6e, 0x74, 0x6f, 0x68, 0x6c, 0x49, 0x15, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x6f, + 0x63, 0x6b, 0x61, 0x64, 0x64, 0x72, 0x4a, 0x15, 0x73, 0x6f, 0x63, 0x6b, + 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x4b, 0x16, 0x69, 0x70, 0x76, 0x34, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x4c, 0x16, 0x69, 0x70, 0x76, 0x36, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x4d, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x4e, 0x13, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4f, + 0x06, 0x73, 0x65, 0x6e, 0x64, 0x74, 0x6f, 0x50, 0x13, 0x5f, 0x5f, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x6f, 0x51, 0x08, 0x72, 0x65, 0x63, 0x76, 0x66, 0x72, + 0x6f, 0x6d, 0x52, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, + 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x66, 0x72, 0x6f, + 0x6d, 0x53, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x10, 0x5f, + 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x55, 0x1a, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x69, + 0x70, 0x34, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x56, 0x1b, 0x69, 0x70, 0x76, + 0x36, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x61, + 0x73, 0x69, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x01, 0x1f, 0x47, 0x4f, + 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x11, 0x02, 0x00, 0x07, 0x2e, 0x72, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x01, 0x05, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x00, 0x26, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, + 0x01, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, + 0x62, 0x79, 0x01, 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x06, 0x31, 0x37, + 0x2e, 0x30, 0x2e, 0x36, 0x00, 0x39, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x03, 0x2b, + 0x0b, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x2b, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x2d, + 0x65, 0x78, 0x74 +}; \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/src/main.c b/product-mini/platforms/zephyr/simple-http/src/main.c new file mode 100644 index 0000000000..a9caf5d0c4 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/src/main.c @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +// #include + +#include +#include +#include "bh_platform.h" +#include "bh_assert.h" +#include "bh_log.h" +#include "wasm_export.h" +#include "http_get.h" + +#include +#include +#include +#include +#include +#include + +#define CONFIG_HEAP_MEM_POOL_SIZE WASM_GLOBAL_HEAP_SIZE +#define CONFIG_APP_STACK_SIZE 8192 +#define CONFIG_APP_HEAP_SIZE 8192 + +static char global_heap_buf[CONFIG_HEAP_MEM_POOL_SIZE] = { 0 }; + +static int app_argc; +static char **app_argv; + +int +main(void) +{ + int start, end; + start = k_uptime_get_32(); + uint8 *wasm_file_buf = NULL; + uint32 wasm_file_size; + wasm_module_t wasm_module = NULL; + wasm_module_inst_t wasm_module_inst = NULL; + RuntimeInitArgs init_args; + char error_buf[128]; + const char *exception; + + int log_verbose_level = 2; + + memset(&init_args, 0, sizeof(RuntimeInitArgs)); + +#if WASM_ENABLE_GLOBAL_HEAP_POOL != 0 + init_args.mem_alloc_type = Alloc_With_Pool; + init_args.mem_alloc_option.pool.heap_buf = global_heap_buf; + init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf); + printf("global heap size: %d\n", sizeof(global_heap_buf)); +#else +#error "memory allocation scheme is not defined." +#endif + + /* initialize runtime environment */ + if (!wasm_runtime_full_init(&init_args)) { + printf("Init runtime environment failed.\n"); + return; + } + + bh_log_set_verbose_level(log_verbose_level); + + /* load WASM byte buffer from byte buffer of include file */ + wasm_file_buf = (uint8 *)wasm_test_file; + wasm_file_size = sizeof(wasm_test_file); + printf("Wasm file size: %d\n", wasm_file_size); + + /* load WASM module */ + if (!(wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, + error_buf, sizeof(error_buf)))) { + printf("Failed to load module: %s\n", error_buf); + goto fail1; + } + + /* Set the WASI context */ +#if WASM_ENABLE_LIBC_WASI != 0 +#define ADDRESS_POOL_SIZE 1 + const char *addr_pool[ADDRESS_POOL_SIZE] = { + "192.0.2.10/24", + }; + /* No dir list => No file system + * dir_cont = 0 + * No mapped dir list => No file system + * map_dir_cont = 0 + * No environment variables + * env_count = 0 + * No command line arguments + * argv 0 + */ + wasm_runtime_set_wasi_args(wasm_module, NULL, 0, NULL, 0, NULL, 0, NULL, 0); + wasm_runtime_set_wasi_addr_pool(wasm_module, addr_pool, ADDRESS_POOL_SIZE); + wasm_runtime_set_wasi_ns_lookup_pool(wasm_module, NULL, 0); +#endif + + /* instantiate the module */ + if (!(wasm_module_inst = wasm_runtime_instantiate( + wasm_module, CONFIG_APP_STACK_SIZE, CONFIG_APP_HEAP_SIZE, + error_buf, sizeof(error_buf)))) { + printf("Failed to instantiate module: %s\n", error_buf); + goto fail2; + } + + /* invoke the main function */ + if (wasm_runtime_lookup_function(wasm_module_inst, "_start") + || wasm_runtime_lookup_function(wasm_module_inst, "__main_argc_argv")) { + + printf("main found\n"); + wasm_application_execute_main(wasm_module_inst, 0, NULL); + printf("main executed\n"); + } + else { + printf("Failed to lookup function main\n"); + return -1; + } + + if ((exception = wasm_runtime_get_exception(wasm_module_inst))) + printf("%s\n", exception); + + int rc = wasm_runtime_get_wasi_exit_code(wasm_module_inst); + printf("wasi exit code: %d\n", rc); // 1 = _WASI_E2BIG + + /* destroy the module instance */ + wasm_runtime_deinstantiate(wasm_module_inst); + +fail2: + /* unload the module */ + wasm_runtime_unload(wasm_module); + +fail1: + /* destroy runtime environment */ + wasm_runtime_destroy(); + + end = k_uptime_get_32(); + + printf("elapsed: %dms\n", (end - start)); + + return 0; +} \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/to_c_header.py b/product-mini/platforms/zephyr/simple-http/to_c_header.py new file mode 100644 index 0000000000..c9adf57dd8 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/to_c_header.py @@ -0,0 +1,34 @@ +# Copyright (C) 2024 Grenoble INP - ESISAR. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Python script to convert wasm file to byte array in a .h file +import os + +CWD = os.getcwd() +CMAKE_CURRENT_BINARY_DIR = os.getenv('CMAKE_CURRENT_BINARY_DIR', CWD) +CMAKE_CURRENT_SOURCE_DIR = os.getenv('CMAKE_CURRENT_SOURCE_DIR', f'{CWD}/../src') + +LICENCE_HEADER = """/* + * Copyright (c) 2017 Linaro Limited + * Copyright (C) 2024 Grenoble INP - ESISAR Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ +""" + +print('CMAKE_CURRENT_BINARY_DIR:', CMAKE_CURRENT_BINARY_DIR) +print('CMAKE_CURRENT_SOURCE_DIR:', CMAKE_CURRENT_SOURCE_DIR) + +# Open the wasm file in binary mode and read the data +with open(f'{CWD}/wasm-apps/http_get.wasm', 'rb') as f: + wasm_bytes = f.read() + +# Convert the bytes to a comma-separated string of hex values +byte_array = ', '.join(f'0x{byte:02x}' for byte in wasm_bytes) + +# Create the output string +output = f'unsigned char __aligned(4) wasm_test_file[] = {{ {byte_array} }};' + +# Write the output string to the .h file +with open(f'{CWD}/src/http_get.h', 'w') as f: + f.write(output) \ No newline at end of file diff --git a/product-mini/platforms/zephyr/simple-http/wasm-apps/http_get.c b/product-mini/platforms/zephyr/simple-http/wasm-apps/http_get.c new file mode 100644 index 0000000000..581a4aef46 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/wasm-apps/http_get.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2017 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef __wasi__ +#include +#endif + +/* HTTP server to connect to */ +#define HTTP_HOST "192.0.2.10" +/* Port to connect to, as string */ +#define HTTP_PORT "8000" +/* HTTP path to request */ +#define HTTP_PATH "/" + +#define SSTRLEN(s) (sizeof(s) - 1) +// #define CHECK(r) { if (r == -1) { printf("Error %d: " #r "\n", errno); +// exit(1); } } + +#define REQUEST "GET " HTTP_PATH " HTTP/1.0\r\nHost: " HTTP_HOST "\r\n\r\n" + +static char response[1024]; + +int +main(int argc, char **argv) +{ + int st, sock; + struct sockaddr_in addr; + int rc = 0; + + printf("[wasm-mod] Preparing HTTP GET request for http://" HTTP_HOST + ":" HTTP_PORT HTTP_PATH "\n"); + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(8000); + addr.sin_addr.s_addr = + htonl(0xC000020A); // hard coded IP address for 192.0.2.10 + + sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + printf("[wasm-mod] sock = %d\n", sock); + + rc = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + printf("[wasm-mod] connect rc = %d\n", rc); + + rc = sendto(sock, (const void *)REQUEST, SSTRLEN(REQUEST), 0, + (struct sockaddr *)&addr, sizeof(addr)); + printf("[wasm-mod] send rc = %d\n", rc); + if (rc < 0) { + printf("[wasm-mod] Error %d\n", errno); + return 0; + } + + printf("[wasm-mod] Response:\n\n"); + + while (1) { + socklen_t socklen = sizeof(struct sockaddr_in); + int len = recvfrom(sock, response, sizeof(response) - 1, 0, + (struct sockaddr *)&addr, &socklen); + + if (len < 0) { + printf("[wasm-mod] Error %d\n", errno); + return 0; + } + + response[len] = 0; + printf("%s", response); + + if (len == 0) { + printf("[wasm-mod] len = 0 break\n"); + break; + } + } + + printf("\n"); + + (void)close(sock); + printf("[wasm-mod] Connection closed\n"); + return 0; +} diff --git a/product-mini/platforms/zephyr/simple-http/wasm-apps/inc/location.md b/product-mini/platforms/zephyr/simple-http/wasm-apps/inc/location.md new file mode 100644 index 0000000000..51a3ae6f00 --- /dev/null +++ b/product-mini/platforms/zephyr/simple-http/wasm-apps/inc/location.md @@ -0,0 +1,5 @@ +The lib source code are located there: +* [wasi_socket_ext.h](../../../../../../core/iwasm/libraries/lib-socket/inc/wasi_socket_ext.h) +* [wasi_socket_ext.c](../../../../../../core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c) + + diff --git a/product-mini/platforms/zephyr/simple/Dockerfile b/product-mini/platforms/zephyr/simple/Dockerfile index 6449c9862e..8b12e5e347 100644 --- a/product-mini/platforms/zephyr/simple/Dockerfile +++ b/product-mini/platforms/zephyr/simple/Dockerfile @@ -19,7 +19,7 @@ # If you modify this file, you may need to sync the modifications to the # .github/actions/setup-zephyr/action.yml -FROM ghcr.io/zephyrproject-rtos/ci-base:v0.26-branch +FROM ghcr.io/zephyrproject-rtos/ci-base:v0.26-branch@sha256:12f44f069809167ed9d3f1160ca0dbb5a5e9118df37f78092f790b29fb06d962 ARG DEBIAN_FRONTEND=noninteractive ENV TZ=Asian/Shanghai @@ -27,15 +27,16 @@ ARG ZEPHYR_SDK_VERSION=0.16.9 # In west_lite.yml, the Zephyr version is set to v3.7.0 #ARG ZEPHYR_VERSION=3.7.0 -# Install the Zephyr Software Development Kit (SDK) +# Install the Zephyr Software Development Kit (SDK) minimal version WORKDIR /root/zephyrproject/zephyr-sdk # hadolint ignore=DL4006 -RUN wget --progress=dot:giga https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.xz \ +RUN wget --progress=dot:giga https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64_minimal.tar.xz \ && wget --progress=dot:giga -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/sha256.sum | shasum --check --ignore-missing \ - && tar --strip-components=1 -xf zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.xz && rm zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.xz + && tar --strip-components=1 -xf zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64_minimal.tar.xz && rm zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64_minimal.tar.xz # hadolint ignore=DL4006 -# Install host tools and Register Zephyr SDK CMake package -RUN ./setup.sh -h -c +# Install arc tools, host tools and Register Zephyr SDK CMake package +# If you want to use other toolchains, please change the -t option +RUN ./setup.sh -t arc-zephyr-elf -h -c # Install west # hadolint ignore=DL3013,DL3059 diff --git a/samples/basic/CMakeLists.txt b/samples/basic/CMakeLists.txt index 3be19df8c1..e7417e634c 100644 --- a/samples/basic/CMakeLists.txt +++ b/samples/basic/CMakeLists.txt @@ -60,7 +60,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/basic/README.md b/samples/basic/README.md index 32e7ed6501..45530ff7f1 100644 --- a/samples/basic/README.md +++ b/samples/basic/README.md @@ -1,4 +1,6 @@ - +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/basic" +--- The "basic" sample project ============== diff --git a/samples/debug-tools/CMakeLists.txt b/samples/debug-tools/CMakeLists.txt index 512507d6ee..32d219faa5 100644 --- a/samples/debug-tools/CMakeLists.txt +++ b/samples/debug-tools/CMakeLists.txt @@ -60,7 +60,6 @@ set(WAMR_BUILD_DUMP_CALL_STACK 1) # Otherwise stack trace is not printed (addr2l if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/file/README.md b/samples/file/README.md index 98f0cc3a71..a90892ead0 100644 --- a/samples/file/README.md +++ b/samples/file/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/file" +--- # "file" sample introduction This sample demonstrates the supported file interaction API of WASI. diff --git a/samples/file/src/CMakeLists.txt b/samples/file/src/CMakeLists.txt index 19775a08ea..d54e93c082 100644 --- a/samples/file/src/CMakeLists.txt +++ b/samples/file/src/CMakeLists.txt @@ -61,7 +61,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/import-func-callback/CMakeLists.txt b/samples/import-func-callback/CMakeLists.txt new file mode 100644 index 0000000000..be0cc5032a --- /dev/null +++ b/samples/import-func-callback/CMakeLists.txt @@ -0,0 +1,106 @@ +# Copyright (C) 2019 Intel Corporation. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required (VERSION 3.14) + +include(CheckPIESupported) +include(ExternalProject) + +project (import-func-callback) + +set (CMAKE_CXX_STANDARD 17) + +################ runtime settings ################ +string (TOLOWER ${CMAKE_HOST_SYSTEM_NAME} WAMR_BUILD_PLATFORM) +if (APPLE) + add_definitions(-DBH_PLATFORM_DARWIN) +endif () + +# Reset default linker flags +set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +# WAMR features switch + +# Set WAMR_BUILD_TARGET, currently values supported: +# "X86_64", "AMD_64", "X86_32", "AARCH64[sub]", "ARM[sub]", "THUMB[sub]", +# "MIPS", "XTENSA", "RISCV64[sub]", "RISCV32[sub]" +if (NOT DEFINED WAMR_BUILD_TARGET) + if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)") + set (WAMR_BUILD_TARGET "AARCH64") + elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") + set (WAMR_BUILD_TARGET "RISCV64") + elseif (CMAKE_SIZEOF_VOID_P EQUAL 8) + # Build as X86_64 by default in 64-bit platform + set (WAMR_BUILD_TARGET "X86_64") + elseif (CMAKE_SIZEOF_VOID_P EQUAL 4) + # Build as X86_32 by default in 32-bit platform + set (WAMR_BUILD_TARGET "X86_32") + else () + message(SEND_ERROR "Unsupported build target platform!") + endif () +endif () + +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE Debug) +endif () + +set (WAMR_BUILD_INTERP 1) + +if (NOT MSVC) + # linker flags + if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") + endif () + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") + if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") + if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") + endif () + endif () +endif () + +# build out vmlib +set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) +include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) + +add_library(vmlib ${WAMR_RUNTIME_LIB_SOURCE}) + +################ wasm application ################ +if (NOT DEFINED WASI_SDK_DIR) + set (WASI_SDK_DIR "/opt/wasi-sdk") +endif () + +ExternalProject_Add(wasm_app + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_COMMAND} -E env + ${WASI_SDK_DIR}/bin/clang + -nostdlib + --target=wasm32 + -Wl,--no-entry + -Wl,--export=test + -Wl,--allow-undefined + -o ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps/test.wasm + ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps/test.c + BUILD_ALWAYS TRUE + INSTALL_COMMAND "" +) + +################ application related ################ +include_directories(${CMAKE_CURRENT_LIST_DIR}/src) +include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) + +add_executable (import-func-callback src/main.c ${UNCOMMON_SHARED_SOURCE}) + +add_dependencies(import-func-callback wasm_app) + +check_pie_supported() +set_target_properties (import-func-callback PROPERTIES POSITION_INDEPENDENT_CODE ON) + +if (APPLE) + target_link_libraries (import-func-callback vmlib -lm -ldl -lpthread ${LLVM_AVAILABLE_LIBS}) +else () + target_link_libraries (import-func-callback vmlib -lm -ldl -lpthread -lrt ${LLVM_AVAILABLE_LIBS}) +endif () diff --git a/samples/import-func-callback/README.md b/samples/import-func-callback/README.md new file mode 100644 index 0000000000..ee822388b5 --- /dev/null +++ b/samples/import-func-callback/README.md @@ -0,0 +1,14 @@ +# "import function callback" sample introduction + +This sample demonstrates how to use import function callbacks to handle WebAssembly modules that import external functions. The sample shows how to register callback functions for imported functions and execute them when the WASM module loads these imported functions. + +The sample includes a WASM module that imports external functions and a host application that provides callback `import_func_type_callback` for these imported functions. + +## Build and run the sample + +```bash +mkdir build && cd build +cmake .. +cmake --build . --config Release +./import-func-callback +``` diff --git a/samples/import-func-callback/src/main.c b/samples/import-func-callback/src/main.c new file mode 100644 index 0000000000..a5f9a9acfe --- /dev/null +++ b/samples/import-func-callback/src/main.c @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "wasm_export.h" +#include "bh_read_file.h" +#include "bh_getopt.h" +#include "assert.h" + +typedef void (*wasm_func_type_callback_t)(const wasm_import_t *import_type); + +const char *import_func_names[] = { "import_func1", "import_func2" }; + +void +import_func_type_callback(const wasm_import_t *import_type) +{ + int ret = 0; + for (uint32_t i = 0; + i < sizeof(import_func_names) / sizeof(import_func_names[0]); i++) { + if (strcmp(import_type->name, import_func_names[i]) == 0) { + ret = 1; + break; + } + } + assert(ret == 1); + return; +} + +/* Iterate over all import functions in the module */ +void +wasm_runtime_for_each_import_func(const wasm_module_t module, + wasm_func_type_callback_t callback) +{ + int32_t import_count = wasm_runtime_get_import_count(module); + if (import_count <= 0) + return; + if (callback == NULL) + return; + + for (int32_t i = 0; i < import_count; ++i) { + wasm_import_t import_type; + wasm_runtime_get_import_type(module, i, &import_type); + + if (import_type.kind != WASM_IMPORT_EXPORT_KIND_FUNC) { + continue; + } + + callback(&import_type); + } +} + +int +main(int argc, char *argv_main[]) +{ + static char global_heap_buf[512 * 1024]; + wasm_module_t module = NULL; + uint32 buf_size; + char *buffer = NULL; + const char *wasm_path = "wasm-apps/test.wasm"; + char error_buf[128]; + + RuntimeInitArgs init_args; + memset(&init_args, 0, sizeof(RuntimeInitArgs)); + + init_args.mem_alloc_type = Alloc_With_Pool; + init_args.mem_alloc_option.pool.heap_buf = global_heap_buf; + init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf); + + if (!wasm_runtime_full_init(&init_args)) { + printf("Init runtime environment failed.\n"); + return -1; + } + buffer = bh_read_file_to_buffer(wasm_path, &buf_size); + + if (!buffer) { + printf("Open wasm app file [%s] failed.\n", wasm_path); + goto fail; + } + + module = wasm_runtime_load((uint8 *)buffer, buf_size, error_buf, + sizeof(error_buf)); + if (!module) { + printf("Load wasm app file [%s] failed.\n", wasm_path); + goto fail; + } + + wasm_runtime_for_each_import_func(module, import_func_type_callback); + +fail: + if (module) + wasm_runtime_unload(module); + if (buffer) + BH_FREE(buffer); + wasm_runtime_destroy(); + return 0; +} diff --git a/samples/import-func-callback/wasm-apps/test.c b/samples/import-func-callback/wasm-apps/test.c new file mode 100644 index 0000000000..5e6f30b5c6 --- /dev/null +++ b/samples/import-func-callback/wasm-apps/test.c @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +extern int +import_func1(int a, int b); +extern int +import_func2(int a); + +int +test() +{ + int a = import_func1(1, 2); + int b = import_func2(3); + return a + b; +} diff --git a/samples/inst-context-threads/CMakeLists.txt b/samples/inst-context-threads/CMakeLists.txt index 5ce8696d8d..b32d3053bf 100644 --- a/samples/inst-context-threads/CMakeLists.txt +++ b/samples/inst-context-threads/CMakeLists.txt @@ -61,7 +61,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/inst-context/CMakeLists.txt b/samples/inst-context/CMakeLists.txt index af387ca267..b9866a5ebd 100644 --- a/samples/inst-context/CMakeLists.txt +++ b/samples/inst-context/CMakeLists.txt @@ -60,7 +60,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/multi-module/CMakeLists.txt b/samples/multi-module/CMakeLists.txt index 3c2e8bd207..7d0499e4cc 100644 --- a/samples/multi-module/CMakeLists.txt +++ b/samples/multi-module/CMakeLists.txt @@ -65,7 +65,6 @@ set(WAMR_BUILD_MULTI_MODULE 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/multi-module/README.md b/samples/multi-module/README.md index 5aac0a5f45..8e5d8fe8fc 100644 --- a/samples/multi-module/README.md +++ b/samples/multi-module/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/multi-module" +--- # WAMR MULTI-MODUEL SAMPLE **WAMR supports *multi-module* in both *interpreter* mode and *aot* mode.** diff --git a/samples/multi-thread/CMakeLists.txt b/samples/multi-thread/CMakeLists.txt index 67819eca2d..71a1cc5b44 100644 --- a/samples/multi-thread/CMakeLists.txt +++ b/samples/multi-thread/CMakeLists.txt @@ -54,7 +54,6 @@ set(WAMR_BUILD_LIB_PTHREAD_SEMAPHORE 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/multi-thread/README.md b/samples/multi-thread/README.md new file mode 100644 index 0000000000..ccd23730ee --- /dev/null +++ b/samples/multi-thread/README.md @@ -0,0 +1,3 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/multi-thread" +--- \ No newline at end of file diff --git a/samples/native-lib/CMakeLists.txt b/samples/native-lib/CMakeLists.txt index d8201bae4f..497727cb09 100644 --- a/samples/native-lib/CMakeLists.txt +++ b/samples/native-lib/CMakeLists.txt @@ -52,7 +52,6 @@ set (WAMR_BUILD_FAST_INTERP 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out libiwasm set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/native-lib/README.md b/samples/native-lib/README.md index 8af01b23ca..2ce5e8ff62 100644 --- a/samples/native-lib/README.md +++ b/samples/native-lib/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/native-lib" +--- # "native-lib" sample introduction This sample demonstrates how to write required interfaces in native library, build it into a shared library and register the shared library to iwasm. diff --git a/samples/native-stack-overflow/CMakeLists.txt b/samples/native-stack-overflow/CMakeLists.txt index efe5b5dc05..a2079bf4f5 100644 --- a/samples/native-stack-overflow/CMakeLists.txt +++ b/samples/native-stack-overflow/CMakeLists.txt @@ -60,7 +60,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/ref-types/CMakeLists.txt b/samples/ref-types/CMakeLists.txt index fd18e63780..0d0852a2ee 100644 --- a/samples/ref-types/CMakeLists.txt +++ b/samples/ref-types/CMakeLists.txt @@ -74,7 +74,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/ref-types/README.md b/samples/ref-types/README.md new file mode 100644 index 0000000000..d8eb205cca --- /dev/null +++ b/samples/ref-types/README.md @@ -0,0 +1,3 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/ref-types" +--- \ No newline at end of file diff --git a/samples/sgx-ra/README.md b/samples/sgx-ra/README.md index 179a074b87..42240b303f 100644 --- a/samples/sgx-ra/README.md +++ b/samples/sgx-ra/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/sgx-ra" +--- "sgx-ra" sample introduction ============== diff --git a/samples/shared-heap/CMakeLists.txt b/samples/shared-heap/CMakeLists.txt index 03906f7c32..94690a4ed5 100644 --- a/samples/shared-heap/CMakeLists.txt +++ b/samples/shared-heap/CMakeLists.txt @@ -61,7 +61,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/shared-module/CMakeLists.txt b/samples/shared-module/CMakeLists.txt index c094b071c9..4c9201e51c 100644 --- a/samples/shared-module/CMakeLists.txt +++ b/samples/shared-module/CMakeLists.txt @@ -65,7 +65,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/socket-api/CMakeLists.txt b/samples/socket-api/CMakeLists.txt index a68d0caba9..ca3484668d 100644 --- a/samples/socket-api/CMakeLists.txt +++ b/samples/socket-api/CMakeLists.txt @@ -34,7 +34,7 @@ endif() message(CHECK_START "Detecting WASI_TOOLCHAIN_FILE at ${WASI_SDK_DIR}") find_file(WASI_TOOLCHAIN_FILE - wasi-sdk.cmake + wasi-sdk-pthread.cmake PATHS "${WASI_SDK_DIR}/share/cmake" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH @@ -46,7 +46,7 @@ else() endif() if(WASI_TOOLCHAIN_FILE-NOTFOUND) - message(FATAL_ERROR "Can not find wasi-sdk.cmake under ${WASI_SDK_DIR}") + message(FATAL_ERROR "Can not find wasi-sdk-pthread.cmake under ${WASI_SDK_DIR}") endif() message(CHECK_START "Detecting WASI_SYS_ROOT at ${WASI_SDK_DIR}") @@ -80,10 +80,7 @@ ExternalProject_Add(wasm-app SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-src UPDATE_COMMAND "" PATCH_COMMAND "" - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/../../wamr-sdk/app/libc-builtin-sysroot/include/pthread.h - ${CMAKE_CURRENT_SOURCE_DIR}/wasm-src/inc - && ${CMAKE_COMMAND} + CONFIGURE_COMMAND ${CMAKE_COMMAND} -DWASI_SDK_PREFIX=${WASI_SDK_DIR} -DCMAKE_TOOLCHAIN_FILE=${WASI_TOOLCHAIN_FILE} -DCMAKE_SYSROOT=${WASI_SYS_ROOT} @@ -170,14 +167,13 @@ set(WAMR_BUILD_AOT 1) set(WAMR_BUILD_JIT 0) set(WAMR_BUILD_LIBC_BUILTIN 1) set(WAMR_BUILD_LIBC_WASI 1) -set(WAMR_BUILD_LIB_PTHREAD 1) set(WAMR_BUILD_REF_TYPES 1) +set(WAMR_BUILD_LIB_WASI_THREADS 1) # compiling and linking flags if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build vmlib static lib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/socket-api/README.md b/samples/socket-api/README.md index f172c5b172..1122967c09 100644 --- a/samples/socket-api/README.md +++ b/samples/socket-api/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/socket-api" +--- # "socket-api" sample introduction This sample demonstrates how to use WAMR socket-api to develop wasm network applications. diff --git a/samples/socket-api/sample_test_run.py b/samples/socket-api/sample_test_run.py index 6e9153b248..9951a3766f 100755 --- a/samples/socket-api/sample_test_run.py +++ b/samples/socket-api/sample_test_run.py @@ -31,7 +31,7 @@ def run_cmd(cmd, cwd): shlex.split(cmd), cwd=cwd, check=False, capture_output=True ) if (qry_prc.returncode != 0): - print("Run {} failed, return {}".format(cmd), qry_prc.returncode) + print("Run {} failed, return {}".format(cmd, qry_prc.returncode)) return print("return code: {}, output:\n{}".format(qry_prc.returncode, qry_prc.stdout.decode())) diff --git a/samples/socket-api/wasm-src/CMakeLists.txt b/samples/socket-api/wasm-src/CMakeLists.txt index 38e8139168..2de2b7688d 100644 --- a/samples/socket-api/wasm-src/CMakeLists.txt +++ b/samples/socket-api/wasm-src/CMakeLists.txt @@ -88,4 +88,4 @@ compile_with_clang(udp_server.c) compile_with_clang(multicast_client.c) compile_with_clang(multicast_server.c) compile_with_clang(timeout_client.c) -compile_with_clang(timeout_server.c) +compile_with_clang(timeout_server.c) \ No newline at end of file diff --git a/samples/spawn-thread/CMakeLists.txt b/samples/spawn-thread/CMakeLists.txt index 29c4dc429c..6733ca13fe 100644 --- a/samples/spawn-thread/CMakeLists.txt +++ b/samples/spawn-thread/CMakeLists.txt @@ -53,7 +53,6 @@ set(WAMR_BUILD_SHARED_MEMORY 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/spawn-thread/README.md b/samples/spawn-thread/README.md new file mode 100644 index 0000000000..ec32364710 --- /dev/null +++ b/samples/spawn-thread/README.md @@ -0,0 +1,3 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/spawn-thread" +--- \ No newline at end of file diff --git a/samples/terminate/CMakeLists.txt b/samples/terminate/CMakeLists.txt index 246b835ddc..3807332588 100644 --- a/samples/terminate/CMakeLists.txt +++ b/samples/terminate/CMakeLists.txt @@ -68,7 +68,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/wasi-threads/CMakeLists.txt b/samples/wasi-threads/CMakeLists.txt index 08cc3a7ffb..d532139665 100644 --- a/samples/wasi-threads/CMakeLists.txt +++ b/samples/wasi-threads/CMakeLists.txt @@ -55,7 +55,6 @@ set(WAMR_BUILD_REF_TYPES 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/wasm-c-api-imports/CMakeLists.txt b/samples/wasm-c-api-imports/CMakeLists.txt index 1325e110cb..bf318a2989 100644 --- a/samples/wasm-c-api-imports/CMakeLists.txt +++ b/samples/wasm-c-api-imports/CMakeLists.txt @@ -75,7 +75,6 @@ set(WAMR_BUILD_SIMD 0) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") # build out vmlib set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) diff --git a/samples/wasm-c-api/CMakeLists.txt b/samples/wasm-c-api/CMakeLists.txt index 06dc92d5ef..c15cd28026 100644 --- a/samples/wasm-c-api/CMakeLists.txt +++ b/samples/wasm-c-api/CMakeLists.txt @@ -86,7 +86,6 @@ if (NOT MSVC) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/samples/wasm-c-api/README.md b/samples/wasm-c-api/README.md index 22595d1559..205c57b1a0 100644 --- a/samples/wasm-c-api/README.md +++ b/samples/wasm-c-api/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/wasm-c-api" +--- WAMR supports *wasm-c-api* in both *interpreter* mode and *aot* mode. Before staring, we need to download and install [WABT](https://github.com/WebAssembly/wabt/releases/latest). diff --git a/samples/workload/README.md b/samples/workload/README.md index af13d5d3e9..8f9371723e 100644 --- a/samples/workload/README.md +++ b/samples/workload/README.md @@ -1,3 +1,6 @@ +--- +description: "The related code/working directory of this example resides in directory {WAMR_DIR}/samples/workload" +--- All workloads have similar requirement of software dependencies, including **emsdk** and **binaryen** > There might be slight differences when using MacOS and other Linux distro than Ubuntu. This document targets diff --git a/test-tools/aot-analyzer/CMakeLists.txt b/test-tools/aot-analyzer/CMakeLists.txt index 6f5f588cb8..04d3b636ce 100644 --- a/test-tools/aot-analyzer/CMakeLists.txt +++ b/test-tools/aot-analyzer/CMakeLists.txt @@ -61,11 +61,6 @@ if (NOT DEFINED WAMR_BIG_ENDIAN) set (WAMR_BIG_ENDIAN 0) endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow -Wno-unused-parameter") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile b/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile index 8165bd5f5f..08f94366a7 100644 --- a/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile +++ b/test-tools/wamr-ide/WASM-Debug-Server/Docker/Dockerfile @@ -1,7 +1,7 @@ # Copyright (C) 2019 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -FROM gcc:12.2.0 AS BASE +FROM gcc:12.2.0@sha256:a3e091325c0af43bc9c1c576ddd155351d5b16438124421188bb4b4fcacc1452 AS BASE ## set work directory WORKDIR /root/ @@ -21,7 +21,7 @@ RUN cmake .. -DWAMR_BUILD_DEBUG_INTERP=1 \ && cp /root/wasm-micro-runtime/product-mini/platforms/linux/build/iwasm /root/iwasm \ && rm -fr /root/wasm-micro-runtime -FROM ubuntu:22.04 +FROM ubuntu:22.04@sha256:104ae83764a5119017b8e8d6218fa0832b09df65aae7d5a6de29a85d813da2fb # COPY files from BASE image COPY --from=BASE /root/iwasm /root COPY --from=BASE /root/debug.sh /root diff --git a/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile b/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile index cd8da38d91..335122b8cd 100644 --- a/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile +++ b/test-tools/wamr-ide/WASM-Toolchain/Docker/Dockerfile @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception ## Build docker image that consists of gcc, cmake, wasi-sdk & zephyr sdk -FROM gcc:12.2.0 AS BASE +FROM gcc:12.2.0@sha256:a3e091325c0af43bc9c1c576ddd155351d5b16438124421188bb4b4fcacc1452 AS BASE ## set work directory WORKDIR /root/ @@ -48,7 +48,7 @@ RUN cmake .. \ && rm -fr /root/wasm-micro-runtime # ## STAGE 2 -FROM ubuntu:22.04 +FROM ubuntu:22.04@sha256:104ae83764a5119017b8e8d6218fa0832b09df65aae7d5a6de29a85d813da2fb ENV HOME_DIR=/home/wasm-toolchain RUN mkdir -p /opt/wasi-sdk \ diff --git a/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile b/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile index 877f479115..cd67b88464 100644 --- a/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile +++ b/tests/fuzz/wasm-mutator-fuzz/portal/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16 as builder +FROM node:16@sha256:f77a1aef2da8d83e45ec990f45df50f1a286c5fe8bbfb8c6e4246c6389705c0b as builder WORKDIR /portal COPY . . @@ -13,7 +13,7 @@ RUN npm install && chmod +x node_modules/.bin/tsc \ && chmod +x node_modules/.bin/vite \ && npm run build -FROM nginx:alpine +FROM nginx:alpine@sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14 WORKDIR /portal COPY --from=builder /portal/dist/ /usr/share/nginx/html/ RUN rm /etc/nginx/conf.d/default.conf diff --git a/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile b/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile index 881bce3be2..10bddcf5a4 100644 --- a/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile +++ b/tests/fuzz/wasm-mutator-fuzz/server/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:20.04@sha256:8feb4d8ca5354def3d8fce243717141ce31e2c428701f6682bd2fafe15388214 WORKDIR /wamr-test/tests/fuzz/wasm-mutator-fuzz/server COPY ./tests/fuzz/wasm-mutator-fuzz/server/requirements.txt /requirements.txt diff --git a/tests/regression/ba-issues/issues/issue-4643/test.wasm b/tests/regression/ba-issues/issues/issue-4643/test.wasm new file mode 100644 index 0000000000..0b6d62b5a9 Binary files /dev/null and b/tests/regression/ba-issues/issues/issue-4643/test.wasm differ diff --git a/tests/regression/ba-issues/issues/issue-4643/test.wat b/tests/regression/ba-issues/issues/issue-4643/test.wat new file mode 100644 index 0000000000..1fecee5944 --- /dev/null +++ b/tests/regression/ba-issues/issues/issue-4643/test.wat @@ -0,0 +1,43 @@ +(module + (memory 1) + (export "memory" (memory 0)) + + (func $test + ;; Add 130 i64 locals (260 slots) to push v128 past offset 256 + (local $d0 i64) (local $d1 i64) (local $d2 i64) (local $d3 i64) (local $d4 i64) + (local $d5 i64) (local $d6 i64) (local $d7 i64) (local $d8 i64) (local $d9 i64) + (local $d10 i64) (local $d11 i64) (local $d12 i64) (local $d13 i64) (local $d14 i64) + (local $d15 i64) (local $d16 i64) (local $d17 i64) (local $d18 i64) (local $d19 i64) + (local $d20 i64) (local $d21 i64) (local $d22 i64) (local $d23 i64) (local $d24 i64) + (local $d25 i64) (local $d26 i64) (local $d27 i64) (local $d28 i64) (local $d29 i64) + (local $d30 i64) (local $d31 i64) (local $d32 i64) (local $d33 i64) (local $d34 i64) + (local $d35 i64) (local $d36 i64) (local $d37 i64) (local $d38 i64) (local $d39 i64) + (local $d40 i64) (local $d41 i64) (local $d42 i64) (local $d43 i64) (local $d44 i64) + (local $d45 i64) (local $d46 i64) (local $d47 i64) (local $d48 i64) (local $d49 i64) + (local $d50 i64) (local $d51 i64) (local $d52 i64) (local $d53 i64) (local $d54 i64) + (local $d55 i64) (local $d56 i64) (local $d57 i64) (local $d58 i64) (local $d59 i64) + (local $d60 i64) (local $d61 i64) (local $d62 i64) (local $d63 i64) (local $d64 i64) + (local $d65 i64) (local $d66 i64) (local $d67 i64) (local $d68 i64) (local $d69 i64) + (local $d70 i64) (local $d71 i64) (local $d72 i64) (local $d73 i64) (local $d74 i64) + (local $d75 i64) (local $d76 i64) (local $d77 i64) (local $d78 i64) (local $d79 i64) + (local $d80 i64) (local $d81 i64) (local $d82 i64) (local $d83 i64) (local $d84 i64) + (local $d85 i64) (local $d86 i64) (local $d87 i64) (local $d88 i64) (local $d89 i64) + (local $d90 i64) (local $d91 i64) (local $d92 i64) (local $d93 i64) (local $d94 i64) + (local $d95 i64) (local $d96 i64) (local $d97 i64) (local $d98 i64) (local $d99 i64) + (local $d100 i64) (local $d101 i64) (local $d102 i64) (local $d103 i64) (local $d104 i64) + (local $d105 i64) (local $d106 i64) (local $d107 i64) (local $d108 i64) (local $d109 i64) + (local $d110 i64) (local $d111 i64) (local $d112 i64) (local $d113 i64) (local $d114 i64) + (local $d115 i64) (local $d116 i64) (local $d117 i64) (local $d118 i64) (local $d119 i64) + (local $d120 i64) (local $d121 i64) (local $d122 i64) (local $d123 i64) (local $d124 i64) + (local $d125 i64) (local $d126 i64) (local $d127 i64) (local $d128 i64) (local $d129 i64) + + (local $vec v128) + + ;; Should hit WASM_OP_TEE_LOCAL rather than EXT_OP_TEE_LOCAL_FAST_V128 + (v128.const i32x4 1 2 3 4) + (local.tee $vec) + (drop) + ) + + (export "_start" (func $test)) +) diff --git a/tests/regression/ba-issues/issues/issue-4646/test.wasm b/tests/regression/ba-issues/issues/issue-4646/test.wasm new file mode 100644 index 0000000000..e163405eec Binary files /dev/null and b/tests/regression/ba-issues/issues/issue-4646/test.wasm differ diff --git a/tests/regression/ba-issues/issues/issue-4646/test.wat b/tests/regression/ba-issues/issues/issue-4646/test.wat new file mode 100644 index 0000000000..3fd503c550 --- /dev/null +++ b/tests/regression/ba-issues/issues/issue-4646/test.wat @@ -0,0 +1,31 @@ +;; define different reference types +(type $struct_a (struct (field (mut i32)))) +(type $struct_b (struct (field (mut i64)))) +(type $struct_c (struct (field (mut i32)) (field (mut i32)))) + +(func $main + ;; prepare parameters: i32, ref_a, i32, ref_b + (i32.const 10) + (struct.new $struct_a (i32.const 100)) + (i32.const 20) + (struct.new $struct_b (i64.const 200)) + + ;; block with interleaved parameters: i32, ref_a, i32, ref_b -> ref_c + (block (param i32 (ref $struct_a) i32 (ref $struct_b)) (result (ref $struct_c)) + ;; clean up parameters from stack + drop ;; drop ref_b + drop ;; drop i32 + drop ;; drop ref_a + drop ;; drop i32 + + ;; return new type reference struct_c + (struct.new $struct_c (i32.const 300) (i32.const 400)) + ) + + ;; drop return value + drop +) + +(memory 1) +(export "memory" (memory 0)) +(export "_start" (func $main)) \ No newline at end of file diff --git a/tests/regression/ba-issues/run.py b/tests/regression/ba-issues/run.py index 5a57bfcf6f..d50bf9b14e 100755 --- a/tests/regression/ba-issues/run.py +++ b/tests/regression/ba-issues/run.py @@ -11,6 +11,7 @@ import glob import re import argparse +import sys from typing import Dict, Optional, List @@ -275,6 +276,11 @@ def process_and_run_test_cases( else: print(f" Issues not found in folder: {format_issue_ids_should_test}") + if failed > 0: + # Exit with error code if there are failed test for CI + print("Some tests failed, see log file for details.") + sys.exit(1) + def main(): parser = argparse.ArgumentParser(description="Run BA issue tests.") diff --git a/tests/regression/ba-issues/running_config.json b/tests/regression/ba-issues/running_config.json index 9288eb9704..bc62c54915 100644 --- a/tests/regression/ba-issues/running_config.json +++ b/tests/regression/ba-issues/running_config.json @@ -1754,6 +1754,38 @@ "stdout content": "", "description": "no sanitizer 'heap-buffer-overflow'" } + }, + { + "deprecated": false, + "ids": [ + 4643 + ], + "runtime": "iwasm-default-wasi-disabled", + "file": "test.wasm", + "mode": "fast-interp", + "options": "-f _start", + "argument": "", + "expected return": { + "ret code": 0, + "stdout content": "", + "description": "no 'invalid local type'" + } + }, + { + "deprecated": false, + "ids": [ + 4646 + ], + "runtime": "iwasm-default-gc-enabled", + "file": "test.wasm", + "mode": "classic-interp", + "options": "-f _start", + "argument": "", + "expected return": { + "ret code": 0, + "stdout content": "", + "description": "load successfully" + } } ] } diff --git a/tests/standalone/test-invoke-native/CMakeLists.txt b/tests/standalone/test-invoke-native/CMakeLists.txt index 9ba5858425..ce659ae42a 100644 --- a/tests/standalone/test-invoke-native/CMakeLists.txt +++ b/tests/standalone/test-invoke-native/CMakeLists.txt @@ -103,11 +103,6 @@ if (NOT WAMR_BUILD_PLATFORM STREQUAL "darwin") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -# set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wsign-conversion") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") - if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64") if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register") diff --git a/tests/standalone/test-module-malloc/CMakeLists.txt b/tests/standalone/test-module-malloc/CMakeLists.txt index bdaff68347..c63d6678c0 100644 --- a/tests/standalone/test-module-malloc/CMakeLists.txt +++ b/tests/standalone/test-module-malloc/CMakeLists.txt @@ -58,7 +58,6 @@ set (WAMR_BUILD_LIBC_WASI 1) if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") endif () -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security") ################ wasm application ############### add_subdirectory(wasm-app) diff --git a/tests/standalone/test-running-modes/c-embed/CMakeLists.txt b/tests/standalone/test-running-modes/c-embed/CMakeLists.txt index a79ca33b57..9b3cf43fda 100644 --- a/tests/standalone/test-running-modes/c-embed/CMakeLists.txt +++ b/tests/standalone/test-running-modes/c-embed/CMakeLists.txt @@ -43,8 +43,6 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") if (NOT WAMR_BUILD_PLATFORM STREQUAL "darwin") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") endif () -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wshadow") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") # build out vmlib include(${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index b726f83a12..9c641049b4 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -30,13 +30,8 @@ if(WAMR_BUILD_TARGET STREQUAL "X86_32") set(CMAKE_LIBRARY_ARCHITECTURE "i386-linux-gnu" CACHE STRING "" FORCE) endif() -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - # Fetch Google test include (FetchContent) - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24") FetchContent_Declare ( googletest @@ -50,10 +45,11 @@ else() ) endif() +# Prevent overriding the parent project's compiler/linker +# settings on Windows +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) -SET(GOOGLETEST_INCLUDED 1) - include(GoogleTest) enable_testing() @@ -64,12 +60,13 @@ add_subdirectory(libc-builtin) add_subdirectory(shared-utils) add_subdirectory(linear-memory-wasm) add_subdirectory(linear-memory-aot) -add_subdirectory(aot-stack-frame) add_subdirectory(linux-perf) add_subdirectory(gc) add_subdirectory(tid-allocator) if (NOT WAMR_BUILD_TARGET STREQUAL "X86_32") + add_subdirectory(aot-stack-frame) + # should enable 32-bit llvm when X86_32 add_subdirectory (aot) add_subdirectory (custom-section) diff --git a/tests/unit/README.md b/tests/unit/README.md new file mode 100644 index 0000000000..8b50bcb5a5 --- /dev/null +++ b/tests/unit/README.md @@ -0,0 +1,195 @@ +# Guide to Creating a Test Suite for a New Feature in WAMR + +This guide provides instructions for contributors on how to create a test suite for a new feature in the WAMR project. Follow these steps to ensure consistency and maintainability across the test framework. + +--- + +## General Guidelines + +- **Create a New Directory**: + Always create a dedicated directory for a new feature under the `tests/unit/` directory. + + - Reuse existing test cases and patch them when possible to avoid redundancy. + - Name the directory in lowercase with words separated by hyphens (e.g., `new-feature`). + - Name the test source file in lowercase with words separated by underscore (e.g., `new_test.cc`). + +- **Avoid Committing `.wasm` Files**: + Do not commit precompiled `.wasm` files. Instead: + + - Generate `.wasm` files from `.wat` or `.c` source files. + - Use `ExternalProject` and the `wasi-sdk` toolchain to compile `.wasm` files during the build process. + +- **Keep Using `ctest` as the framework**: + Continue to use `ctest` for running the test cases, as it is already integrated into the existing test framework. + +--- + +## Writing `CMakeLists.txt` for the Test Suite + +When creating a `CMakeLists.txt` file for your test suite, follow these best practices: + +1. **Do Not Fetch Googletest Again**: + The root `unit/CMakeLists.txt` already fetches Googletest. Avoid including or fetching it again in your test suite. + +2. **Find LLVM on Demand**: + If your test suite requires LLVM, use `find_package` to locate LLVM components as needed. Do not include LLVM globally unless required. + +3. **Include `unit_common.cmake`**: + Always include `../unit_common.cmake` in your `CMakeLists.txt` to avoid duplicating common configurations and utilities. + + Example: + + ```cmake + include("../unit_common.cmake") + ``` + +4. **Use `WAMR_RUNTIME_LIB_SOURCE`**: + Replace long lists of runtime source files with the `WAMR_RUNTIME_LIB_SOURCE` variable to simplify your configuration. + + Example: + + ```cmake + target_sources(your_test_target PRIVATE ${WAMR_RUNTIME_LIB_SOURCE}) + ``` + +5. **Avoid Global Compilation Flags**: + Do not define global compilation flags in the `unit` directory. Each test case should specify its own compilation flags based on its unique requirements. + +--- + +## Generating `.wasm` Files + +- **Compile `.wasm` Files Dynamically**: + Use `ExternalProject` in your `CMakeLists.txt` to compile `.wasm` files from `.wat` or `.c` source files. + - Use the `wasi-sdk` toolchain for `.c` or `.cc` source files. + - Example configuration: + ```cmake + ExternalProject_Add( + generate_wasm + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BUILD_ALWAYS YES + CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -B build + -DWASI_SDK_PREFIX=${WASI_SDK_DIR} + -DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN} + BUILD_COMMAND ${CMAKE_COMMAND} --build build + INSTALL_COMMAND ${CMAKE_COMMAND} --install build --prefix ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps + ) + ``` +- **Example for `wasm-apps` Directory**: + Place your source files in a `wasm-apps/` subdirectory within your test suite directory. + + - Create a `CMakeLists.txt` in `wasm-apps/` to handle the compilation of these files. + - Example `CMakeLists.txt` for `wasm-apps/`: + + ```cmake + cmake_minimum_required(VERSION 3.13) + project(wasm_apps) + + add_executable(example example.c) + set_target_properties(example PROPERTIES SUFFIX .wasm) + install(TARGETS example DESTINATION .) + ``` + +--- + +## Compiling and Running Test Cases + +To compile and run the test cases, follow these steps: + +1. **Generate Build Files**: + + ```bash + cmake -S . -B build + ``` + +2. **Build the Test Suite**: + + ```bash + cmake --build build + ``` + +3. **Run the Tests**: + + ```bash + ctest --test-dir build --output-on-failure + ``` + + This will compile and execute all test cases in the test suite, displaying detailed output for any failures. + +4. **List all Tests**: + To see all available test cases, use: + + ```bash + ctest --test-dir build -N + ``` + +5. **Run a Specific Test**: + To run a specific test case, use: + ```bash + ctest --test-dir build -R --output-on-failure + ``` + +--- + +## Collecting Code Coverage Data + +To collect code coverage data using `lcov`, follow these steps: + +1. **Build with Coverage Flags**: + Ensure the test suite is built with coverage flags enabled: + + ```bash + cmake -S . -B build -DCOLLECT_CODE_COVERAGE=1 + cmake --build build + ``` + +2. **Run the Tests**: + Execute the test cases as described above. + +3. **Generate Coverage Report**: + Use `lcov` to collect and generate the coverage report: + + ```bash + lcov --capture --directory build --output-file coverage.all.info + lcov --extract coverage.all.info "*/core/iwasm/*" "*/core/shared/*" --output-file coverage.info + genhtml coverage.info --output-directory coverage-report + ``` + +4. **View the Report**: + Open the `index.html` file in the `coverage-report` directory to view the coverage results in your browser. + +5. **Summary of Coverage**: + To get a summary of the coverage data, use: + + ```bash + lcov --summary coverage.info + ``` + +--- + +## Example Directory Structure + +Here’s an example of how your test suite directory might look: + +``` +new-feature/ +├── CMakeLists.txt +├── new_feature_test.cc +├── wasm-apps/ +| ├── CMakeLists.txt +│ ├── example.c +│ └── example.wat +``` + +--- + +## Additional Notes + +- **Testing Framework**: Use Googletest for writing unit tests. Refer to existing test cases in the `tests/unit/` directory for examples. +- **Documentation**: Add comments in your test code to explain the purpose of each test case. +- **Edge Cases**: Ensure your test suite covers edge cases and potential failure scenarios. +- **Reuse Utilities**: Leverage existing utilities in `common/` (e.g., `mock_allocator.h`, `test_helper.h`) to simplify your test code. + +--- + +By following these guidelines, you can create a well-structured and maintainable test suite that integrates seamlessly with the WAMR testing framework. diff --git a/tests/unit/aot-stack-frame/CMakeLists.txt b/tests/unit/aot-stack-frame/CMakeLists.txt index 90a61aea76..b20bb67b9a 100644 --- a/tests/unit/aot-stack-frame/CMakeLists.txt +++ b/tests/unit/aot-stack-frame/CMakeLists.txt @@ -8,7 +8,7 @@ project (test-aot-stack-frame) add_definitions (-DRUN_ON_LINUX) set (WAMR_BUILD_AOT 1) -set (WAMR_BUILD_INTERP 0) +set (WAMR_BUILD_INTERP 1) set (WAMR_BUILD_JIT 0) set (WAMR_BUILD_SIMD 1) set (WAMR_BUILD_REF_TYPES 1) @@ -21,6 +21,10 @@ set (WAMR_BUILD_GC 1) include (../unit_common.cmake) +find_package(LLVM REQUIRED CONFIG) +include_directories(${LLVM_INCLUDE_DIRS}) +add_definitions(${LLVM_DEFINITIONS}) + include_directories (${CMAKE_CURRENT_SOURCE_DIR}) add_definitions (-DWASM_ENABLE_AOT_STACK_FRAME=1) @@ -32,22 +36,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${IWASM_COMPL_SOURCE} +) # Automatically build wasm-apps for this test add_subdirectory(wasm-apps) @@ -59,4 +51,4 @@ add_dependencies (aot_stack_frame_test aot-stack-frame-test-wasm) target_link_libraries (aot_stack_frame_test ${LLVM_AVAILABLE_LIBS} gtest_main ) -#gtest_discover_tests(aot_stack_frame_test) \ No newline at end of file +gtest_discover_tests(aot_stack_frame_test) \ No newline at end of file diff --git a/tests/unit/aot/CMakeLists.txt b/tests/unit/aot/CMakeLists.txt index bb2216bddf..e45d4c0032 100644 --- a/tests/unit/aot/CMakeLists.txt +++ b/tests/unit/aot/CMakeLists.txt @@ -13,21 +13,18 @@ add_definitions (-DWASM_ENABLE_WAMR_COMPILER=1) add_definitions (-DWASM_ENABLE_DUMP_CALL_STACK=1) add_definitions (-DWASM_ENABLE_AOT_STACK_FRAME=1) +set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) set (WAMR_BUILD_LIBC_WASI 0) -set (WAMR_BUILD_APP_FRAMEWORK 1) +set (WAMR_BUILD_APP_FRAMEWORK 0) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) @@ -39,16 +36,9 @@ set (UNIT_SOURCE ${source_all}) set (unit_test_sources ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} ${IWASM_COMPL_SOURCE} - ) +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (aot_test ${unit_test_sources}) diff --git a/tests/unit/compilation/CMakeLists.txt b/tests/unit/compilation/CMakeLists.txt index 65a9dfbdaa..f6912122d9 100644 --- a/tests/unit/compilation/CMakeLists.txt +++ b/tests/unit/compilation/CMakeLists.txt @@ -14,22 +14,20 @@ add_definitions (-DWASM_ENABLE_DUMP_CALL_STACK=1) add_definitions (-DWASM_ENABLE_AOT_STACK_FRAME=1) set (WAMR_BUILD_LIBC_WASI 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) +set (WAMR_BUILD_MULTI_MODULE 1) set (WAMR_BUILD_APP_FRAMEWORK 0) set (WAMR_BUILD_THREAD_MGR 1) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) @@ -40,22 +38,11 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${IWASM_COMPL_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (compilation_test ${unit_test_sources}) diff --git a/tests/unit/custom-section/CMakeLists.txt b/tests/unit/custom-section/CMakeLists.txt index 747a8b1263..b57fb8bffb 100644 --- a/tests/unit/custom-section/CMakeLists.txt +++ b/tests/unit/custom-section/CMakeLists.txt @@ -2,16 +2,31 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception cmake_minimum_required(VERSION 3.14) - project (test-custom-section) +set(WASI_SDK_DIR "/opt/wasi-sdk") +set(WASISDK_TOOLCHAIN "${WASI_SDK_DIR}/share/cmake/wasi-sdk.cmake") + +include(ExternalProject) +ExternalProject_Add( + custom-section-test-wasm-apps + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BUILD_ALWAYS YES + CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -B build + -DWASI_SDK_PREFIX=${WASI_SDK_DIR} + -DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN} + BUILD_COMMAND ${CMAKE_COMMAND} --build build + INSTALL_COMMAND ${CMAKE_COMMAND} --install build --prefix ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps +) + add_definitions (-DRUN_ON_LINUX) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_LIBC_BUILTIN 0) -set (WAMR_BUILD_JIT 0) -set (WAMR_BUILD_LAZY_JIT 0) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) add_definitions(-DWASM_ENABLE_WAMR_COMPILER=1) add_definitions (-DWASM_ENABLE_DUMP_CALL_STACK=1) @@ -22,16 +37,9 @@ set (WAMR_BUILD_LOAD_CUSTOM_SECTION 1) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) @@ -42,20 +50,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ) - -# Automatically build wasm-apps for this test -add_subdirectory(wasm-apps) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${IWASM_COMPL_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (custom_section_test ${unit_test_sources}) diff --git a/tests/unit/custom-section/wasm-apps/CMakeLists.txt b/tests/unit/custom-section/wasm-apps/CMakeLists.txt index 6455db554d..6f80d6968a 100644 --- a/tests/unit/custom-section/wasm-apps/CMakeLists.txt +++ b/tests/unit/custom-section/wasm-apps/CMakeLists.txt @@ -2,13 +2,20 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception cmake_minimum_required(VERSION 3.14) +project(wasm-apps) -project(wasm-apps-custom-section) +add_executable(app.wasm app.c) +target_compile_options(app.wasm PUBLIC -g -nostdlib) +target_link_options(app.wasm PRIVATE + -nostdlib + LINKER:--allow-undefined + LINKER:--export-all + LINKER:--no-entry +) -# Add -g option so there will be debugger related custom sections -add_custom_target(app.wasm ALL - COMMAND /opt/wasi-sdk/bin/clang -g -nostdlib - -Wl,--no-entry,--export-all - -o ${CMAKE_CURRENT_BINARY_DIR}/app.wasm - ${CMAKE_CURRENT_LIST_DIR}/app.c +# install .wasm +set( + WASM_FILES + ${CMAKE_CURRENT_BINARY_DIR}/app.wasm ) +install(FILES ${WASM_FILES} DESTINATION .) diff --git a/tests/unit/gc/CMakeLists.txt b/tests/unit/gc/CMakeLists.txt index 6d9670dfe5..c8b865a384 100644 --- a/tests/unit/gc/CMakeLists.txt +++ b/tests/unit/gc/CMakeLists.txt @@ -21,21 +21,9 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} ) add_executable (gc_test ${unit_test_sources}) @@ -48,4 +36,4 @@ add_custom_command(TARGET gc_test POST_BUILD COMMENT "Copy wasm files to directory ${CMAKE_CURRENT_BINARY_DIR}" ) -#gtest_discover_tests(gc_test) \ No newline at end of file +gtest_discover_tests(gc_test) \ No newline at end of file diff --git a/tests/unit/interpreter/CMakeLists.txt b/tests/unit/interpreter/CMakeLists.txt index f0a1d5e22a..ef65e443f7 100644 --- a/tests/unit/interpreter/CMakeLists.txt +++ b/tests/unit/interpreter/CMakeLists.txt @@ -11,9 +11,12 @@ add_definitions (-Dattr_container_malloc=malloc) add_definitions (-Dattr_container_free=free) # add_definitions (-DWASM_ENABLE_WAMR_COMPILER=1) +set(WAMR_BUILD_AOT 0) +set(WAMR_BUILD_FAST_INTERP 0) +set(WAMR_BUILD_INTERP 1) +set(WAMR_BUILD_JIT 0) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_APP_FRAMEWORK 1) -set (WAMR_BUILD_AOT 0) include (../unit_common.cmake) @@ -24,19 +27,13 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable (interpreter_test ${unit_test_sources}) -target_link_libraries (interpreter_test ${LLVM_AVAILABLE_LIBS} gtest_main ) +target_link_libraries (interpreter_test gtest_main ) gtest_discover_tests(interpreter_test) diff --git a/tests/unit/libc-builtin/CMakeLists.txt b/tests/unit/libc-builtin/CMakeLists.txt index f39ed44444..789018c3bc 100644 --- a/tests/unit/libc-builtin/CMakeLists.txt +++ b/tests/unit/libc-builtin/CMakeLists.txt @@ -7,10 +7,15 @@ project (test-libc-builtin) add_definitions (-DRUN_ON_LINUX) -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - +set (WAMR_BUILD_AOT 0) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_APP_FRAMEWORK 0) +# FIXME: if removed, LibcBuiltinTest.calloc will be failed +set (WAMR_BUILD_MULTI_MODULE 1) include (../unit_common.cmake) @@ -21,9 +26,9 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} +) add_executable (libc_builtin_test ${unit_test_sources}) diff --git a/tests/unit/linear-memory-aot/CMakeLists.txt b/tests/unit/linear-memory-aot/CMakeLists.txt index 02e96c6d10..b76881f7f3 100644 --- a/tests/unit/linear-memory-aot/CMakeLists.txt +++ b/tests/unit/linear-memory-aot/CMakeLists.txt @@ -12,6 +12,7 @@ set (WAMR_BUILD_APP_FRAMEWORK 0) set (WAMR_BUILD_MEMORY_PROFILING 1) set (WAMR_BUILD_INTERP 0) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) include (../unit_common.cmake) @@ -22,21 +23,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} + ${IWASM_COMPL_SOURCE} ) # Test case: .aot file with hardware bound check. diff --git a/tests/unit/linear-memory-wasm/CMakeLists.txt b/tests/unit/linear-memory-wasm/CMakeLists.txt index a899b8fbe4..084d0c0942 100644 --- a/tests/unit/linear-memory-wasm/CMakeLists.txt +++ b/tests/unit/linear-memory-wasm/CMakeLists.txt @@ -25,18 +25,6 @@ set (unit_test_sources ${UNIT_SOURCE} ${WAMR_RUNTIME_LIB_SOURCE} ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} ) # Test case: .wasm file with hardware bound check. diff --git a/tests/unit/linux-perf/CMakeLists.txt b/tests/unit/linux-perf/CMakeLists.txt index 572a087050..e5e2d56921 100644 --- a/tests/unit/linux-perf/CMakeLists.txt +++ b/tests/unit/linux-perf/CMakeLists.txt @@ -10,8 +10,9 @@ add_definitions (-DRUN_ON_LINUX) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_LIBC_BUILTIN 0) set (WAMR_BUILD_JIT 0) -set (WAMR_BUILD_LAZY_JIT 0) set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) set (WAMR_BUILD_MULTI_MODULE 0) set (WAMR_BUILD_LINUX_PERF 1) @@ -22,22 +23,15 @@ set (WAMR_BUILD_DUMP_CALL_STACK 1) include (../unit_common.cmake) -set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () -set (CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include (${IWASM_DIR}/compilation/iwasm_compl.cmake) add_executable (linux_perf_test test_sort_func_ptrs.cc) target_compile_options(linux_perf_test PUBLIC -fpermissive) -target_link_libraries(linux_perf_test gtest_main ) +target_link_libraries(linux_perf_test ${LLVM_AVAILABLE_LIBS} gtest_main ) target_link_options(linux_perf_test PUBLIC LINKER:--unresolved-symbols=ignore-all diff --git a/tests/unit/memory64/CMakeLists.txt b/tests/unit/memory64/CMakeLists.txt index f3629a7c40..b19c9d9cfa 100644 --- a/tests/unit/memory64/CMakeLists.txt +++ b/tests/unit/memory64/CMakeLists.txt @@ -22,20 +22,9 @@ set(WAMR_BUILD_SHARED_MEMORY 1) # include(GoogleTest) include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") - -include(${IWASM_DIR}/compilation/iwasm_compl.cmake) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -43,14 +32,11 @@ file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set(UNIT_SOURCE ${source_all}) -aux_source_directory(. SRC_LIST) - set(unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(memory64_test ${unit_test_sources}) diff --git a/tests/unit/running-modes/CMakeLists.txt b/tests/unit/running-modes/CMakeLists.txt index 5fc6a80bce..3a5ca4745a 100644 --- a/tests/unit/running-modes/CMakeLists.txt +++ b/tests/unit/running-modes/CMakeLists.txt @@ -5,52 +5,51 @@ cmake_minimum_required(VERSION 3.14) project(test-running-modes) -# Compile wasm modules -add_subdirectory(wasm-apps) +set(WASI_SDK_DIR "/opt/wasi-sdk") +set(WASISDK_TOOLCHAIN "${WASI_SDK_DIR}/share/cmake/wasi-sdk.cmake") + +include(ExternalProject) +ExternalProject_Add( + test-running-modes-wasm-apps + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps + BUILD_ALWAYS YES + CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -B build + -DWASI_SDK_PREFIX=${WASI_SDK_DIR} + -DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN} + BUILD_COMMAND ${CMAKE_COMMAND} --build build + INSTALL_COMMAND ${CMAKE_COMMAND} --install build --prefix ${CMAKE_CURRENT_BINARY_DIR} +) add_definitions(-DRUN_ON_LINUX) +set(WAMR_BUILD_LIBC_BUILTIN 1) +set(WAMR_BUILD_MULTI_MODULE 0) set(WAMR_BUILD_LIBC_WASI 1) set(WAMR_BUILD_APP_FRAMEWORK 0) set(WAMR_BUILD_JIT 1) set(WAMR_BUILD_FAST_JIT 1) +set(WAMR_BUILD_REF_TYPES 1) # if only load this CMake other than load it as subdirectory include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") - -include(${IWASM_DIR}/compilation/iwasm_compl.cmake) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) - -set(UNIT_SOURCE ${source_all}) - -aux_source_directory(. SRC_LIST) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC_LIST) set(unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ) + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} + ${SRC_LIST} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(wasm_running_modes_test ${unit_test_sources}) - target_link_libraries(wasm_running_modes_test ${LLVM_AVAILABLE_LIBS} gtest_main) +add_dependencies(wasm_running_modes_test test-running-modes-wasm-apps) gtest_discover_tests(wasm_running_modes_test) diff --git a/tests/unit/running-modes/wasm-apps/CMakeLists.txt b/tests/unit/running-modes/wasm-apps/CMakeLists.txt index b2f1e9c0c5..c840169379 100644 --- a/tests/unit/running-modes/wasm-apps/CMakeLists.txt +++ b/tests/unit/running-modes/wasm-apps/CMakeLists.txt @@ -4,46 +4,30 @@ cmake_minimum_required(VERSION 3.14) project(wasm-apps) -set(WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../..) - -set(CMAKE_SYSTEM_PROCESSOR wasm32) -set(CMAKE_SYSROOT ${WAMR_ROOT_DIR}/wamr-sdk/app/libc-builtin-sysroot) - -if (NOT DEFINED WASI_SDK_DIR) - set(WASI_SDK_DIR "/opt/wasi-sdk") -endif () - -set(CMAKE_C_FLAGS "-nostdlib -pthread -Qunused-arguments") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -z stack-size=8192 -nostdlib") -set(CMAKE_C_COMPILER_TARGET "wasm32") -set(CMAKE_C_COMPILER "${WASI_SDK_DIR}/bin/clang") - -set(DEFINED_SYMBOLS - "${WAMR_ROOT_DIR}/wamr-sdk/app/libc-builtin-sysroot/share/defined-symbols.txt") - -set(CMAKE_EXE_LINKER_FLAGS - "-Wl,--no-entry \ - -Wl,--initial-memory=65536 \ - -Wl,--export-all \ - -Wl,--allow-undefined" - ) - add_executable(mytest.wasm mytest.c) -target_link_libraries(mytest.wasm) +target_compile_options(mytest.wasm PUBLIC -nostdlib) +target_link_options(mytest.wasm PRIVATE + -nostdlib + LINKER:--allow-undefined + LINKER:--export-all + LINKER:--initial-memory=131072 + LINKER:--no-entry +) add_executable(hello.wasm hello.c) -target_link_libraries(hello.wasm) - -add_custom_command(TARGET hello.wasm POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_BINARY_DIR}/hello.wasm - ${CMAKE_CURRENT_BINARY_DIR}/../ - COMMENT "Copy hello.wasm to the same directory of google test" - ) - -add_custom_command(TARGET mytest.wasm POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_BINARY_DIR}/mytest.wasm - ${CMAKE_CURRENT_BINARY_DIR}/../ - COMMENT "Copy mytest.wasm to the same directory of google test" - ) +target_compile_options(hello.wasm PUBLIC -nostdlib) +target_link_options(hello.wasm PRIVATE + -nostdlib + LINKER:--allow-undefined + LINKER:--export-all + LINKER:--initial-memory=131072 + LINKER:--no-entry +) + +# install .wasm +set( + WASM_FILES + ${CMAKE_CURRENT_BINARY_DIR}/hello.wasm + ${CMAKE_CURRENT_BINARY_DIR}/mytest.wasm +) +install(FILES ${WASM_FILES} DESTINATION .) diff --git a/tests/unit/runtime-common/CMakeLists.txt b/tests/unit/runtime-common/CMakeLists.txt index 21e5a917f2..9ef07ff50c 100644 --- a/tests/unit/runtime-common/CMakeLists.txt +++ b/tests/unit/runtime-common/CMakeLists.txt @@ -7,23 +7,20 @@ project(test-runtime-common) add_definitions(-DRUN_ON_LINUX) -set(WAMR_BUILD_LIBC_WASI 0) -set(WAMR_BUILD_APP_FRAMEWORK 0) +set (WAMR_BUILD_AOT 1) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) +set (WAMR_BUILD_LIBC_WASI 0) +set (WAMR_BUILD_LIBC_BUILTIN 1) +set (WAMR_BUILD_APP_FRAMEWORK 0) +set (WAMR_BUILD_MULTI_MODULE 1) include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if(NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif() - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -31,13 +28,10 @@ file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set(UNIT_SOURCE ${source_all}) -aux_source_directory(. SRC_LIST) - set(unit_test_sources ${UNIT_SOURCE} ${WAMR_RUNTIME_LIB_SOURCE} ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} ) add_executable(runtime_common_test ${unit_test_sources}) @@ -45,11 +39,8 @@ add_executable(runtime_common_test ${unit_test_sources}) target_link_libraries(runtime_common_test ${LLVM_AVAILABLE_LIBS} gtest_main) # Ensure that aot compiled is completed before linear_memory_test_aot is built -set(dummy_output "${CMAKE_CURRENT_BINARY_DIR}/dummy_output") - -add_custom_command(OUTPUT ${dummy_output} +add_custom_command(OUTPUT ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot COMMAND ./build_aot.sh - COMMAND ${CMAKE_COMMAND} -E touch ${dummy_output} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/build_aot.sh COMMENT "Executing script to compile aot files" @@ -58,15 +49,15 @@ add_custom_command(OUTPUT ${dummy_output} add_custom_target( BuildAot ALL - DEPENDS ${dummy_output} + DEPENDS ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot ) add_dependencies(runtime_common_test BuildAot) add_custom_command(TARGET runtime_common_test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.wasm ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot - ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.wasm ${CMAKE_CURRENT_LIST_DIR}/wasm-apps/main.aot + ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Copy main.wasm and main.aot to the directory: build/runtime-common." ) diff --git a/tests/unit/runtime-common/wasm_runtime_common_test.cc b/tests/unit/runtime-common/wasm_runtime_common_test.cc index 15a02673b2..b1282091c5 100644 --- a/tests/unit/runtime-common/wasm_runtime_common_test.cc +++ b/tests/unit/runtime-common/wasm_runtime_common_test.cc @@ -381,18 +381,6 @@ TEST_F(wasm_runtime_common_test_suite, functions_on_wasm_module) exec_env, (WASMFunctionInstanceCommon *)(&func_test_1), 0, nullptr, 1, arguments)); -#if 0 - WASMFunctionInstance func_test; - WASMFunctionImport func_import_test; - WASMType *func_type_1 = nullptr; - func_import_test.func_type = func_type; - func_test.u.func_import = &func_import_test; - func_test.is_import_func = true; - func_type_1 = wasm_runtime_get_function_type(&func_test, - wasm_module_inst->module_type); - EXPECT_NE(func_type_1, nullptr); -#endif - EXPECT_EQ(true, wasm_runtime_create_exec_env_singleton(wasm_module_inst)); EXPECT_NE(nullptr, wasm_runtime_get_exec_env_singleton(wasm_module_inst)); diff --git a/tests/unit/shared-heap/CMakeLists.txt b/tests/unit/shared-heap/CMakeLists.txt index fa7067918a..e1e7a1a9a3 100644 --- a/tests/unit/shared-heap/CMakeLists.txt +++ b/tests/unit/shared-heap/CMakeLists.txt @@ -29,19 +29,6 @@ endif () # if only load this CMake other than load it as subdirectory include(../unit_common.cmake) -set(LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") - -if (NOT EXISTS "${LLVM_SRC_ROOT}/build") - message(FATAL_ERROR "Cannot find LLVM dir: ${LLVM_SRC_ROOT}/build") -endif () - -set(CMAKE_PREFIX_PATH "${LLVM_SRC_ROOT}/build;${CMAKE_PREFIX_PATH}") -find_package(LLVM REQUIRED CONFIG) -include_directories(${LLVM_INCLUDE_DIRS}) -add_definitions(${LLVM_DEFINITIONS}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") - include(${IWASM_DIR}/compilation/iwasm_compl.cmake) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -50,18 +37,15 @@ file(GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set(UNIT_SOURCE ${source_all}) -aux_source_directory(. SRC_LIST) - set(unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} - ${UNCOMMON_SHARED_SOURCE} - ${SRC_LIST} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(shared_heap_test ${unit_test_sources}) -target_link_libraries(shared_heap_test ${LLVM_AVAILABLE_LIBS} gtest_main) +target_link_libraries(shared_heap_test gtest_main) gtest_discover_tests(shared_heap_test) diff --git a/tests/unit/shared-heap/shared_heap_test.cc b/tests/unit/shared-heap/shared_heap_test.cc index 47d2eb3e82..434b4c3899 100644 --- a/tests/unit/shared-heap/shared_heap_test.cc +++ b/tests/unit/shared-heap/shared_heap_test.cc @@ -217,6 +217,62 @@ TEST_F(shared_heap_test, test_preallocated_shared_heap_malloc_fail) EXPECT_EQ(0, argv[0]); } +TEST_F(shared_heap_test, test_preallocated_shared_runtime_api) +{ + struct ret_env tmp_module_env; + SharedHeapInitArgs args = { 0 }; + WASMSharedHeap *shared_heap = nullptr; + uint32 argv[1] = { 0 }; + void *native_ptr; + uint64 offset, size; + bool ret; + + args.size = 0x4000; + shared_heap = wasm_runtime_create_shared_heap(&args); + + if (!shared_heap) { + FAIL() << "Failed to create shared heap"; + } + + if (!load_wasm("test.wasm", 0, tmp_module_env)) { + FAIL() << "Failed to load wasm file\n"; + } + + if (!wasm_runtime_attach_shared_heap(tmp_module_env.wasm_module_inst, + shared_heap)) { + ADD_FAILURE() << "Failed to attach shared heap\n"; + goto fail1; + } + + offset = wasm_runtime_shared_heap_malloc(tmp_module_env.wasm_module_inst, + 32, &native_ptr); + if (!offset) { + ADD_FAILURE() << "Failed to attach shared heap\n"; + goto fail2; + } + + size = (uint64_t)UINT32_MAX + 0x2000; + printf("offset %lx size: %lx\n", offset, size); + ASSERT_EQ(false, wasm_runtime_validate_app_addr( + tmp_module_env.wasm_module_inst, offset, size)); + + ASSERT_EQ(NULL, wasm_runtime_addr_app_to_native( + tmp_module_env.wasm_module_inst, offset + size)); + + size = (uint64_t)10; + ASSERT_EQ(true, wasm_runtime_validate_app_addr( + tmp_module_env.wasm_module_inst, offset, size)); + + ASSERT_EQ(native_ptr + size, + wasm_runtime_addr_app_to_native(tmp_module_env.wasm_module_inst, + offset + size)); + +fail2: + wasm_runtime_detach_shared_heap(tmp_module_env.wasm_module_inst); +fail1: + destroy_module_env(tmp_module_env); +} + static void create_test_shared_heap(uint8 *preallocated_buf, size_t size, WASMSharedHeap **shared_heap_res) diff --git a/tests/unit/shared-utils/CMakeLists.txt b/tests/unit/shared-utils/CMakeLists.txt index 47b6b835ba..c6f250e6df 100644 --- a/tests/unit/shared-utils/CMakeLists.txt +++ b/tests/unit/shared-utils/CMakeLists.txt @@ -7,6 +7,10 @@ project (test-shared-utils) add_definitions (-DRUN_ON_LINUX) +set (WAMR_BUILD_AOT 0) +set (WAMR_BUILD_FAST_INTERP 0) +set (WAMR_BUILD_INTERP 1) +set (WAMR_BUILD_JIT 0) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_APP_FRAMEWORK 0) @@ -19,8 +23,8 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${WAMR_RUNTIME_LIB_SOURCE} + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} ) add_executable (shared_utils_test ${unit_test_sources}) diff --git a/tests/unit/unit_common.cmake b/tests/unit/unit_common.cmake index 66c50b7e8c..53e9ae50df 100644 --- a/tests/unit/unit_common.cmake +++ b/tests/unit/unit_common.cmake @@ -1,26 +1,14 @@ # Copyright (C) 2019 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# Yes. To solve the compatibility issue with CMAKE (>= 4.0), we need to update -# our `cmake_minimum_required()` to 3.5. However, there are CMakeLists.txt -# from 3rd parties that we should not alter. Therefore, in addition to -# changing the `cmake_minimum_required()`, we should also add a configuration -# here that is compatible with earlier versions. -set(CMAKE_POLICY_VERSION_MINIMUM 3.5 FORCE) - if (NOT DEFINED WAMR_BUILD_PLATFORM) set (WAMR_BUILD_PLATFORM "linux") endif () -set (UNIT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}) - -include_directories(${UNIT_ROOT_DIR}) - enable_language (ASM) -# Reset default linker flags -set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") -set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") +# Usually, test cases should identify their unique +# complation flags to implement their test plan # Set WAMR_BUILD_TARGET, currently values supported: # "X86_64", "AMD_64", "X86_32", "ARM_32", "MIPS_32", "XTENSA_32" @@ -34,52 +22,6 @@ if (NOT DEFINED WAMR_BUILD_TARGET) endif () endif () -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE Debug) -endif () - -if (NOT DEFINED WAMR_BUILD_INTERP) - # Enable Interpreter by default - set (WAMR_BUILD_INTERP 1) -endif () - -if (NOT DEFINED WAMR_BUILD_AOT) - # Enable AOT by default. - set (WAMR_BUILD_AOT 1) -endif () - -if (NOT DEFINED WAMR_BUILD_JIT) - # Disable JIT by default. - set (WAMR_BUILD_JIT 0) -endif () - -if (NOT DEFINED WAMR_BUILD_LIBC_BUILTIN) - # Enable libc builtin support by default - set (WAMR_BUILD_LIBC_BUILTIN 1) -endif () - -if (NOT DEFINED WAMR_BUILD_LIBC_WASI) - # Enable libc wasi support by default - set (WAMR_BUILD_LIBC_WASI 1) -endif () - -if (NOT DEFINED WAMR_BUILD_MULTI_MODULE) - set (WAMR_BUILD_MULTI_MODULE 1) -endif() - -if (NOT DEFINED WAMR_BUILD_APP_FRAMEWORK) - set (WAMR_BUILD_APP_FRAMEWORK 1) -endif () - -if (COLLECT_CODE_COVERAGE EQUAL 1) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") -endif () - -set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections \ - -Wall -Wno-unused-parameter -Wno-pedantic") - set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) # include the build config template file @@ -90,23 +32,20 @@ include_directories (${SHARED_DIR}/include include (${SHARED_DIR}/utils/uncommon/shared_uncommon.cmake) -if (NOT (GOOGLETEST_INCLUDED EQUAL 1)) -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set (gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -# Fetch Google test -include (FetchContent) -FetchContent_Declare ( - googletest - URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip -) -FetchContent_MakeAvailable (googletest) - -endif() - # Add helper classes include_directories(${CMAKE_CURRENT_LIST_DIR}/common) -message ("unit_common.cmake included") +# config_common.cmake only sets up the llvm environment when +# JIT is enabled. but in unit tests, we need llvm environment +# for aot compilation. +if (NOT DEFINED LLVM_DIR) + set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") + set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/build") + if (NOT EXISTS "${LLVM_BUILD_ROOT}") + message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_BUILD_ROOT}") + endif () + set (CMAKE_PREFIX_PATH "${LLVM_BUILD_ROOT};${CMAKE_PREFIX_PATH}") + set (LLVM_DIR ${LLVM_BUILD_ROOT}/lib/cmake/llvm) +endif () +message(STATUS "unit_common.cmake included") diff --git a/tests/unit/wasm-c-api/CMakeLists.txt b/tests/unit/wasm-c-api/CMakeLists.txt index 9556c600e1..3150c93254 100644 --- a/tests/unit/wasm-c-api/CMakeLists.txt +++ b/tests/unit/wasm-c-api/CMakeLists.txt @@ -4,14 +4,8 @@ cmake_minimum_required (VERSION 3.14) project (wasm_c_api_test) -################ runtime settings ################ -set(CMAKE_BUILD_TYPE Debug) set(WAMR_BUILD_PLATFORM "linux") -# Resetdefault linker flags -set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") -set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") - # WAMR features switch if (NOT DEFINED WAMR_BUILD_TARGET) set(WAMR_BUILD_TARGET "X86_64") @@ -23,50 +17,8 @@ set(WAMR_BUILD_LIBC_BUILTIN 1) set(WAMR_BUILD_LIBC_WASI 0) set(WAMR_BUILD_FAST_INTERP 0) -# compiling and linking flags -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -pie -fPIE") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security -mindirect-branch-register") - -# build out vmlib -# hard code path here -set(WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..) -include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) - -add_library(vmlib STATIC ${WAMR_RUNTIME_LIB_SOURCE}) -################################################ - -################ unit test related ################ - -# Yes. To solve the compatibility issue with CMAKE (>= 4.0), we need to update -# our `cmake_minimum_required()` to 3.5. However, there are CMakeLists.txt -# from 3rd parties that we should not alter. Therefore, in addition to -# changing the `cmake_minimum_required()`, we should also add a configuration -# here that is compatible with earlier versions. -set(CMAKE_POLICY_VERSION_MINIMUM 3.5 FORCE) - -# Add googletest directly to our build. This defines -# the gtest and gtest_main targets. - -if (NOT (GOOGLETEST_INCLUDED EQUAL 1)) -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set (gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -# Fetch Google test -include (FetchContent) -FetchContent_Declare ( - googletest - URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip -) -FetchContent_MakeAvailable (googletest) -endif() - -enable_testing() - -add_executable(wasm_c_api_test - basic.cc -) - -target_link_libraries(wasm_c_api_test vmlib gtest_main) +include (../unit_common.cmake) +add_executable(wasm_c_api_test basic.cc ${WAMR_RUNTIME_LIB_SOURCE}) +target_link_libraries(wasm_c_api_test gtest_main) gtest_discover_tests(wasm_c_api_test) diff --git a/tests/unit/wasm-vm/CMakeLists.txt b/tests/unit/wasm-vm/CMakeLists.txt index 6242a48b99..431b945450 100644 --- a/tests/unit/wasm-vm/CMakeLists.txt +++ b/tests/unit/wasm-vm/CMakeLists.txt @@ -7,14 +7,21 @@ project (test-wasm-vm) add_definitions (-DRUN_ON_LINUX) +set(WAMR_BUILD_AOT 0) +set(WAMR_BUILD_FAST_INTERP 0) +set(WAMR_BUILD_INTERP 1) +set(WAMR_BUILD_JIT 0) +set(WAMR_BUILD_LIBC_BUILTIN 1) + add_definitions (-Dattr_container_malloc=malloc) add_definitions (-Dattr_container_free=free) -set (WAMR_BUILD_APP_FRAMEWORK 1) -set (CMAKE_BUILD_TYPE Release) - include (../unit_common.cmake) +find_package(LLVM REQUIRED CONFIG) +include_directories(${LLVM_INCLUDE_DIRS}) +add_definitions(${LLVM_DEFINITIONS}) + include_directories (${CMAKE_CURRENT_SOURCE_DIR}) file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) @@ -22,21 +29,10 @@ file (GLOB_RECURSE source_all ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) set (UNIT_SOURCE ${source_all}) set (unit_test_sources - ${UNIT_SOURCE} - ${PLATFORM_SHARED_SOURCE} - ${UTILS_SHARED_SOURCE} - ${MEM_ALLOC_SHARED_SOURCE} - ${LIB_HOST_AGENT_SOURCE} - ${NATIVE_INTERFACE_SOURCE} - ${LIBC_BUILTIN_SOURCE} - ${LIBC_WASI_SOURCE} - ${IWASM_COMMON_SOURCE} - ${IWASM_INTERP_SOURCE} - ${IWASM_AOT_SOURCE} - ${IWASM_COMPL_SOURCE} - ${WASM_APP_LIB_SOURCE_ALL} - ${UNCOMMON_SHARED_SOURCE} - ) + ${UNIT_SOURCE} + ${WAMR_RUNTIME_LIB_SOURCE} + ${UNCOMMON_SHARED_SOURCE} +) # Now simply link against gtest or gtest_main as needed. Eg add_executable(wasm_vm_test ${unit_test_sources}) diff --git a/tests/wamr-test-suites/spec-test-script/collect_coverage.sh b/tests/wamr-test-suites/spec-test-script/collect_coverage.sh index 0091e76496..12bee733a4 100755 --- a/tests/wamr-test-suites/spec-test-script/collect_coverage.sh +++ b/tests/wamr-test-suites/spec-test-script/collect_coverage.sh @@ -28,10 +28,12 @@ echo "Start to collect code coverage of ${SRC_COV_DIR} .." pushd ${SRC_COV_DIR} > /dev/null 2>&1 # collect all code coverage data -lcov -q -o ${SRC_TEMP_COV_FILE} -c -d . --rc lcov_branch_coverage=1 +# for lcov 2.x: ignore-errors mismatch,negative +lcov -q -o ${SRC_TEMP_COV_FILE} -c -d . --rc lcov_branch_coverage=1 --rc geninfo_unexecuted_blocks=1 # extract code coverage data of WAMR source files +# for lcov 2.x: ignore-errors unused lcov -q -r ${SRC_TEMP_COV_FILE} -o ${SRC_TEMP_COV_FILE} \ - -rc lcov_branch_coverage=1 \ + -rc lcov_branch_coverage=1\ "*/usr/*" "*/_deps/*" "*/deps/*" "*/tests/unit/*" \ "*/llvm/include/*" "*/include/llvm/*" "*/samples/*" \ "*/test-tools/*" "*/tests/standalone/*" "*/tests/*" diff --git a/tests/wamr-test-suites/spec-test-script/gc_array_fill_cases.patch b/tests/wamr-test-suites/spec-test-script/gc_array_fill_cases.patch new file mode 100644 index 0000000000..e10f207f37 --- /dev/null +++ b/tests/wamr-test-suites/spec-test-script/gc_array_fill_cases.patch @@ -0,0 +1,27 @@ +diff --git a/test/core/gc/array_fill.wast b/test/core/gc/array_fill.wast +index 0379ad53..73122178 100644 +--- a/test/core/gc/array_fill.wast ++++ b/test/core/gc/array_fill.wast +@@ -79,3 +79,22 @@ + (assert_return (invoke "array_get_nth" (i32.const 2)) (i32.const 11)) + (assert_return (invoke "array_get_nth" (i32.const 3)) (i32.const 11)) + (assert_return (invoke "array_get_nth" (i32.const 4)) (i32.const 0)) ++ ++;; fill the whole array ++(assert_return (invoke "array_fill" (i32.const 0) (i32.const 42) (i32.const 12))) ++(assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 2)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 5)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 42)) ++ ++;; fill the first element ++(assert_return (invoke "array_fill" (i32.const 0) (i32.const 7) (i32.const 1))) ++(assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 7)) ++(assert_return (invoke "array_get_nth" (i32.const 1)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 42)) ++ ++;; fill the last 2 elements ++(assert_return (invoke "array_fill" (i32.const 10) (i32.const 9) (i32.const 2))) ++(assert_return (invoke "array_get_nth" (i32.const 9)) (i32.const 42)) ++(assert_return (invoke "array_get_nth" (i32.const 10)) (i32.const 9)) ++(assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 9)) diff --git a/tests/wamr-test-suites/test_wamr.sh b/tests/wamr-test-suites/test_wamr.sh index 6f498653f0..b42d1503d3 100755 --- a/tests/wamr-test-suites/test_wamr.sh +++ b/tests/wamr-test-suites/test_wamr.sh @@ -39,7 +39,9 @@ function help() echo "-F set the firmware path used by qemu" echo "-C enable code coverage collect" echo "-j set the platform to test" - echo "-T set sanitizer to use in tests(ubsan|tsan|asan|posan)" + echo "-T set the sanitizer(s) used during testing. It can be either a comma-separated list + (e.g., ubsan, asan) or a single option + (e.g., ubsan, tsan, asan, posan)." echo "-A use the specified wamrc command instead of building it" echo "-N enable extended const expression feature" echo "-r [requirement name] [N [N ...]] specify a requirement name followed by one or more" @@ -327,14 +329,14 @@ function unit_test() echo "Now start unit tests" cd ${WORK_DIR} - rm -fr unittest-build && mkdir unittest-build - cd unittest-build + rm -fr unittest-build echo "Build unit test" touch ${REPORT_DIR}/unit_test_report.txt - cmake ${WORK_DIR}/../../unit -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE} - make -j - make test | tee -a ${REPORT_DIR}/unit_test_report.txt + cmake -S ${WORK_DIR}/../../unit -B unittest-build \ + -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE} + cmake --build unittest-build + ctest --test-dir unittest-build --output-on-failure | tee -a ${REPORT_DIR}/unit_test_report.txt echo "Finish unit tests" } @@ -449,10 +451,10 @@ function spec_test() echo "checkout spec from threads proposal" # check spec test cases for threads - git clone -b main --single-branch https://github.com/WebAssembly/threads.git spec + git clone -b main-legacy --single-branch https://github.com/WebAssembly/threads.git spec pushd spec - # May 31, 2012 [interpreter] implement atomic.wait and atomic.notify (#194) + # May 31, 2023 [interpreter] implement atomic.wait and atomic.notify (#194) git reset --hard 09f2831349bf409187abb6f7868482a8079f2264 git apply --ignore-whitespace ../../spec-test-script/thread_proposal_ignore_cases.patch || exit 1 git apply --ignore-whitespace ../../spec-test-script/thread_proposal_fix_atomic_case.patch || exit 1 @@ -476,6 +478,7 @@ function spec_test() # Dec 9, 2024. Merge branch 'funcref' git reset --hard 756060f5816c7e2159f4817fbdee76cf52f9c923 git apply --ignore-whitespace ../../spec-test-script/gc_ignore_cases.patch || exit 1 + git apply --ignore-whitespace ../../spec-test-script/gc_array_fill_cases.patch || exit 1 if [[ ${ENABLE_QEMU} == 1 ]]; then # Decrease the recursive count for tail call cases as nuttx qemu's @@ -501,7 +504,7 @@ function spec_test() git reset --hard 8d4f6aa2b00a8e7c0174410028625c6a176db8a1 # ignore import table cases git apply --ignore-whitespace ../../spec-test-script/extended_const.patch || exit 1 - + elif [[ ${ENABLE_MEMORY64} == 1 ]]; then echo "checkout spec for memory64 proposal" @@ -1066,26 +1069,9 @@ function trigger() EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_TAIL_CALL=1" fi - echo "SANITIZER IS" $WAMR_BUILD_SANITIZER - - if [[ "$WAMR_BUILD_SANITIZER" == "ubsan" ]]; then - echo "Setting run with ubsan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=ubsan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "asan" ]]; then - echo "Setting run with asan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=asan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "tsan" ]]; then - echo "Setting run with tsan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=tsan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "posan" ]]; then - echo "Setting run with posan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=posan" + if [[ -n "$WAMR_BUILD_SANITIZER" ]]; then + echo "Setting run with sanitizer(s): $WAMR_BUILD_SANITIZER" + EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=$WAMR_BUILD_SANITIZER" fi # Make sure we're using the builtin WASI libc implementation @@ -1202,7 +1188,15 @@ function trigger() } # if collect code coverage, ignore -s, test all test cases. -if [[ $TEST_CASE_ARR ]];then +if [[ $TEST_CASE_ARR == "unit" ]];then + # unit test cases are designed with specific compilation flags + # and run under specific modes. + # There is no need to loop through all running modes in this script. + unit_test || (echo "TEST FAILED"; exit 1) + collect_coverage unit + echo "JUST SKIP UNIT TEST NOW" +elif [[ $TEST_CASE_ARR == "spec" ]];then + # loop through all running modes trigger || (echo "TEST FAILED"; exit 1) else # test all suite, ignore polybench and libsodium because of long time cost @@ -1215,6 +1209,7 @@ else TEST_CASE_ARR+=("libsodium") fi ' + # loop through all running modes trigger || (echo "TEST FAILED"; exit 1) # Add more suites here fi diff --git a/wamr-compiler/CMakeLists.txt b/wamr-compiler/CMakeLists.txt index 8ee61cab4d..513fd0049c 100644 --- a/wamr-compiler/CMakeLists.txt +++ b/wamr-compiler/CMakeLists.txt @@ -41,11 +41,14 @@ endif() add_definitions(-DWASM_ENABLE_INTERP=1) add_definitions(-DWASM_ENABLE_WAMR_COMPILER=1) add_definitions(-DWASM_ENABLE_BULK_MEMORY=1) +add_definitions(-DWASM_ENABLE_BULK_MEMORY_OPT=1) add_definitions(-DWASM_DISABLE_HW_BOUND_CHECK=1) add_definitions(-DWASM_ENABLE_SHARED_MEMORY=1) add_definitions(-DWASM_ENABLE_THREAD_MGR=1) add_definitions(-DWASM_ENABLE_TAIL_CALL=1) add_definitions(-DWASM_ENABLE_REF_TYPES=1) +add_definitions(-DWASM_ENABLE_CALL_INDIRECT_OVERLONG=1) +add_definitions(-DWASM_ENABLE_BRANCH_HINTS=1) add_definitions(-DWASM_ENABLE_CUSTOM_NAME_SECTION=1) add_definitions(-DWASM_ENABLE_AOT_STACK_FRAME=1) add_definitions(-DWASM_ENABLE_DUMP_CALL_STACK=1) @@ -159,6 +162,11 @@ if (WAMR_BUILD_DEBUG_AOT EQUAL 1) endif() # Enable LLVM +# In Debug mode, always use release builds of pre-built dependency libraries +if (WAMR_BUILD_PLATFORM STREQUAL "windows" AND MSVC) + add_compile_options($<$:/MD>) +endif() + if (NOT WAMR_BUILD_WITH_CUSTOM_LLVM) set (LLVM_SRC_ROOT "${PROJECT_SOURCE_DIR}/../core/deps/llvm") if (NOT EXISTS "${LLVM_SRC_ROOT}/build") @@ -199,13 +207,13 @@ if (NOT (CMAKE_C_COMPILER MATCHES ".*clang.*" OR CMAKE_C_COMPILER_ID MATCHES ".* endif() if (NOT MSVC) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security \ - -ffunction-sections -fdata-sections \ - -Wno-unused-parameter -Wno-pedantic") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") # Remove the extra spaces for better make log string (REGEX REPLACE " *" " " CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) endif() +include (${PROJECT_SOURCE_DIR}/../build-scripts/warnings.cmake) + set (SHARED_DIR ../core/shared) set (IWASM_DIR ../core/iwasm) diff --git a/wamr-compiler/build_llvm.sh b/wamr-compiler/build_llvm.sh index c3ec54b61b..c9e2dd910f 100755 --- a/wamr-compiler/build_llvm.sh +++ b/wamr-compiler/build_llvm.sh @@ -3,5 +3,17 @@ # Copyright (C) 2020 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -/usr/bin/env python3 -m pip install --user -r ../build-scripts/requirements.txt +TEMP_DIR=$(mktemp -d) + +cleanup() { + local exit_code=$? + rm -rf "$TEMP_DIR" + exit $exit_code +} + +trap cleanup EXIT INT TERM + +/usr/bin/env python3 -m venv --clear "$TEMP_DIR" +. "$TEMP_DIR/bin/activate" +/usr/bin/env python3 -m pip install -r ../build-scripts/requirements.txt /usr/bin/env python3 ../build-scripts/build_llvm.py "$@" diff --git a/wamr-compiler/build_llvm_arc.sh b/wamr-compiler/build_llvm_arc.sh index d148e11ecc..bc10216e1a 100755 --- a/wamr-compiler/build_llvm_arc.sh +++ b/wamr-compiler/build_llvm_arc.sh @@ -3,5 +3,5 @@ # Copyright (C) 2020 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -/usr/bin/env python3 -m pip install --user -r ../build-scripts/requirements.txt -/usr/bin/env python3 ../build-scripts/build_llvm.py --platform arc "$@" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +$SCRIPT_DIR/build_llvm.sh --platform arc "$@" diff --git a/wamr-compiler/build_llvm_xtensa.sh b/wamr-compiler/build_llvm_xtensa.sh index 183ea379fd..29559ce35e 100755 --- a/wamr-compiler/build_llvm_xtensa.sh +++ b/wamr-compiler/build_llvm_xtensa.sh @@ -3,5 +3,5 @@ # Copyright (C) 2020 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -/usr/bin/env python3 -m pip install --user -r ../build-scripts/requirements.txt -/usr/bin/env python3 ../build-scripts/build_llvm.py --platform xtensa "$@" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +$SCRIPT_DIR/build_llvm.sh --platform xtensa "$@" diff --git a/wamr-compiler/main.c b/wamr-compiler/main.c index 62b0dfb90f..f0675a3511 100644 --- a/wamr-compiler/main.c +++ b/wamr-compiler/main.c @@ -9,6 +9,7 @@ #include "wasm_export.h" #include "aot_export.h" +#include #include #if BH_HAS_DLFCN @@ -158,6 +159,8 @@ print_help() printf(" llvmir-unopt Unoptimized LLVM IR\n"); printf(" llvmir-opt Optimized LLVM IR\n"); printf(" --disable-bulk-memory Disable the MVP bulk memory feature\n"); + printf(" --enable-bulk-memory-opt Enable bulk memory opt feature\n"); + printf(" --enable-extended-const Enable extended const expr feature\n"); printf(" --enable-multi-thread Enable multi-thread feature, the dependent features bulk-memory and\n"); printf(" thread-mgr will be enabled automatically\n"); printf(" --enable-tail-call Enable the post-MVP tail call feature\n"); @@ -166,6 +169,9 @@ print_help() printf(" and by default it is enabled in them and disabled in other targets\n"); printf(" --disable-ref-types Disable the MVP reference types feature, it will be disabled forcibly if\n"); printf(" GC is enabled\n"); + printf(" --enable-call-indirect-overlong\n"); + printf(" Enable call indirect overlong feature\n"); + printf(" --enable-lime1 Enable Lime1\n"); printf(" --disable-aux-stack-check Disable auxiliary stack overflow/underflow check\n"); printf(" --enable-dump-call-stack Enable stack trace feature\n"); printf(" --call-stack-features=\n"); @@ -218,6 +224,7 @@ print_help() printf(" WARNING: enable this feature will largely increase code size\n"); printf(" -v=n Set log verbose level (0 to 5, default is 2), larger with more log\n"); printf(" --version Show version information\n"); + printf(" --llvm-version Show LLVM version information\n"); printf("Examples: wamrc -o test.aot test.wasm\n"); printf(" wamrc --target=i386 -o test.aot test.wasm\n"); printf(" wamrc --target=i386 --format=object -o test.o test.wasm\n"); @@ -421,9 +428,12 @@ main(int argc, char *argv[]) option.enable_simd = true; option.enable_aux_stack_check = true; option.enable_bulk_memory = true; + option.enable_bulk_memory_opt = false; option.enable_ref_types = true; + option.enable_call_indirect_overlong = false; option.enable_gc = false; option.enable_extended_const = false; + option.enable_lime1 = false; aot_call_stack_features_init_default(&option.call_stack_features); /* Process options */ @@ -517,6 +527,9 @@ main(int argc, char *argv[]) else if (!strcmp(argv[0], "--disable-bulk-memory")) { option.enable_bulk_memory = false; } + else if (!strcmp(argv[0], "--enable-bulk-memory-opt")) { + option.enable_bulk_memory_opt = true; + } else if (!strcmp(argv[0], "--enable-multi-thread")) { option.enable_bulk_memory = true; option.enable_thread_mgr = true; @@ -534,12 +547,18 @@ main(int argc, char *argv[]) else if (!strcmp(argv[0], "--disable-ref-types")) { option.enable_ref_types = false; } + else if (!strcmp(argv[0], "--enable-call-indirect-overlong")) { + option.enable_call_indirect_overlong = true; + } else if (!strcmp(argv[0], "--disable-aux-stack-check")) { option.enable_aux_stack_check = false; } else if (!strcmp(argv[0], "--enable-extended-const")) { option.enable_extended_const = true; } + else if (!strcmp(argv[0], "--enable-lime1")) { + option.enable_lime1 = true; + } else if (!strcmp(argv[0], "--enable-dump-call-stack")) { option.aux_stack_frame_type = AOT_STACK_FRAME_TYPE_STANDARD; } @@ -676,6 +695,12 @@ main(int argc, char *argv[]) printf("wamrc %u.%u.%u\n", major, minor, patch); return 0; } + else if (!strcmp(argv[0], "--llvm-version")) { + unsigned major, minor, patch; + LLVMGetVersion(&major, &minor, &patch); + printf("LLVM %u.%u.%u\n", major, minor, patch); + return 0; + } else PRINT_HELP_AND_EXIT(); } @@ -739,6 +764,20 @@ main(int argc, char *argv[]) option.bounds_checks = true; } + if (option.enable_bulk_memory) { + option.enable_bulk_memory_opt = true; + } + + if (option.enable_ref_types) { + option.enable_call_indirect_overlong = true; + } + + if (option.enable_lime1) { + option.enable_call_indirect_overlong = true; + option.enable_bulk_memory_opt = true; + option.enable_extended_const = true; + } + if (!use_dummy_wasm) { wasm_file_name = argv[0]; diff --git a/wamr-wasi-extensions/samples/nn-cli/main.c b/wamr-wasi-extensions/samples/nn-cli/main.c index f85d647568..ca0a893ef1 100644 --- a/wamr-wasi-extensions/samples/nn-cli/main.c +++ b/wamr-wasi-extensions/samples/nn-cli/main.c @@ -406,7 +406,7 @@ get_output(char *options) exit(1); } nnret = - wasi_ephemeral_nn_get_output(c, 0, resultbuf, resultbufsz, &resultsz); + wasi_ephemeral_nn_get_output(c, idx, resultbuf, resultbufsz, &resultsz); if (nnret == wasi_ephemeral_nn_error_too_large) { resultbufsz *= 2; goto retry;